Programowanie w języku Delphi » Gotowce

Dynamiczne okienka jak te z GG

  • 2006-01-24 21:35
  • 14 komentarzy
  • 734 odsłony
  • Oceń ten tekst jako pierwszy
Od jakiegoś czasu robię swój komunikator używając do tego komponentu THGG. Nie mogłem sobie poradzić z tworzeniem dynamicznych okienek, ale w taki sposób, aby okienko, które już zostało utworzone wcześniej nie było tworzone kolejny raz. :) Jestem początkującym w delphi, ale poświęcam na to dużo swojego wolnego czasu. Wiem, że tematy odnośnie tworzenia okienek dynamicznie są na forum, ale albo są niedokończone, albo kody tam zamieszczone są czasami niezrozumiałe dla początkujących. Mnie się jakoś udało to wszystko poskładać do kupy, więc podam kod, który ułatwi życie początkującym (mam taką nadzieję :) )

...
implementation
 
uses ...
 
var  // <--- WSTAWIĆ
 F: array of TForm2; // <--- WSTAWIĆ
 NrOkna: Integer; // <--- WSTAWIĆ
 
 
{$R *.dfm}
...


Teraz w zdarzeniu OnDblClick komponentu ListView (ten komponent użyłem do wyświetlania listy kontaktów) wpisujemy poniższy kod:

procedure TForm1.ListView1DblClick(Sender: TObject);
var
Nr: integer;
begin
if ListView1.Selected=nil then Exit;
 
if HGG1.Connected=false then Exit;
 
if HGG1.Logged=false then Exit;
 
SetLength(F,20);
 
// Sprawdzenie czy istnieje juz to okno
for Nr := 0 to Screen.FormCount -1 do
begin
if F[Nr].Caption='Rozmowa z ' + HGG1.Users.User[ListView1.ItemIndex].Name then
begin
if F[Nr].Showing=true then begin
//Okno istnieje wiec nie tworz nowego tylko pokaz! :)
F[Nr].BringToFront;
exit;
end else begin
//Okno istnieje, ale go nie widac, więc je pokaż (niestety obciąża procesor :)
F[Nr].Show;
F[Nr].BringToFront;
exit;
end;
end;
end;
 
//Okno nie istnieje wiec utworz je!!!
NrOkna:=NrOkna+1;
F[NrOkna] := TForm2.Create(Self);
F[NrOkna].Caption:='Rozmowa z ' +  HGG1.Users.User[ListView1.ItemIndex].Name; 
F[NrOkna].Edit1.Text:=IntToStr(HGG1.Users.User[ListView1.ItemIndex].GGNumber);
F[NrOkna].Show;
 
 
end;


Wiem, że osoby, które na delphi znają się bardzo dobrze pewnie inaczej by to napisali, ale jak dla mnie i dla wielu podobnych to rozwiązanie jest najprostsze.

Mile widziane inne rozwiązania, jeżeli ktoś oczywiście posiada ;)

14 komentarzy

TomRiddle 2011-02-01 18:42

A cha... bo ty je chcesz dynamicznie tworzyć

TomRiddle 2011-02-01 18:42

Lol, robisz tablice Form?

obywatel66 2010-01-15 11:14

wszytko fajnie , ale jest problem jak wstawiać odebraną wiadomość do danego okna....?

manfredek 2008-04-04 21:59

O rany, FindWindow chyba nie bolało??

-=JaCkObS=- 2006-04-14 08:16

Fajne ale z bugami :-/

nameczanin 2006-01-30 18:34

proponuje zapisywanie wskaznikow do foremek, a nie szukanie ich po tytulach o_O

f13 2006-01-14 11:31

A jak zrobic zeby na tej formie wyswietlane były jeszcze 2 komponenty Memo ??

bidok 2005-11-07 21:35

\"który ułatwi życie początkującym\"
a do jakich poczatkujacych sie zwracasz? bo np imho niektorzy poczatkujacy nie bedza rozumieli czemu kompilator wywala blad przy linijce:
[delphi]uses Unit2, Unit3, Unit4, Unit5, Unit6, Unit7;[/delphi]
tak samo nie kazy musi miec TForm2 (moga zmienic nazwe no nie? )
jesli bys to uogolnil to spoko ale w danej chwili to nawet \'glosuj\' sie nie chce kliknac :P
// to mialbyc komentarz motywacyjny :F

Misiek__ 2005-11-08 12:17

\"(mam taką nadzieję :) )\" :P

.::CYMES::. 2005-11-06 03:38

if ListView1.Selected = nil then Exit;
if HGG1.Connected=false then Exit;
if HGG1.Logged=false then Exit;


To jest dziwne nie lepiej:
if (ListView1.Selected <> nil) and (HGG1.Connected=true) and (HGG1.Logged=true) then
  begin
  ...
  end;

necrokris 2005-11-06 02:24

To sie chyba zbuguje jak np. jest user A, otwierasz okno, zamykasz, usuwasz A,zmieniasz nazwe usera B na A, otwierasz okno A.

Misiek__ 2005-11-06 14:10

necrokris miales racje, cos bylo nie tak wczesniej, bo po zamknieciu okna i próbie ponownego jego otwarcia były problemu, ale jakoś sobie z tym poradziłem ;) Może mało profesjinalnie, ale działa :D

PiXel 2006-05-08 08:16

IMO uważam że metoda z tablicą nie jest zbyt dobra.
Też pracuje nad IMem i rozwiązałem do tak:

procedure TfrmMain.CreateChatWindow(User: Integer; Caption: String);
var
  frmMsg1: TfrmMsg; // TfrmMsg jest okienkiem rozmowy
  i: Integer;
begin
  for i := 0 to Screen.FormCount - 1 do begin // pętla przechodzi przez wszystkie okienka w aplikacji
    if Screen.Forms[i].Tag = User then begin // sprawdzamy czy okienko z określonym numerem już istnieje
      Screen.Forms[i].Caption := Caption; // nadajemy tytuł okna
      Screen.Forms[i].SetFocus; // dajemy focus na to okienko
      Exit;  // nie wykonuj reszty funkcji
    end;
  end;
  frmMsg1 := TfrmMsg.Create(Application); // tworzymy nowe okno
  frmMsg1.Tag := User; // właściwośc Tag przechowywuje numer użytkownika z którym rozmawiamy
  frmMsg1.Caption := Caption;
  frmMsg1.Show; // pokazujemy nowo utworzoną formę
end;
 
// zdarzenie występujące w przypadku podwójnego kliknięcia na użyszkodnika ;) 
procedure TfrmMain.lstUsersDblClick(Sender: TObject);
var
  ListItem: TListItem;
begin
  if lstUsers.Selected = nil then Exit;
  CreateChatWindow(gg.Users.User[gg.Users.Find(lstUsers.Selected.Caption)].GGNumber, gg.Users.User[gg.Users.Find(lstUsers.Selected.Caption)].Name);
end;