okay..så et andet spm.. hvordan er det at jeg fanger en bestemt form som er blevet oprettet vha "with"
altså.. jeg har en form1 som tjekker om der er kommet nye beskeder.. og hvis der er.. skal den så tjekke om et vindue (form3 lavet med "with") er åbnet.. altså et vindue til denne kontakt person.. HVIS det er åbnet så skal den bare skrive det ind i form3's msg.add.lines(det er en memo) hvordan gøres det? kan i svare forhøjer jeg point til det i vil have..næsten da
var Forms: array of TForm3; I: Integer; begin SetLength(Forms, 3); for I := 0 to 2 do begin Forms[I] := TForm3.Create(Self); Forms[I].Caption := 'Her har vi form ' + IntToStr(I); end; end;
Når du så skal bruge dem til noget mere, så erklær dit array globalt, evt under private eller public og så HUSK at kalde Free proceduren når du er færdig med at bruge dem...
Gøres på OnClose-eventet i Form3:
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end;
Dette er hvad jeg har i UNIT1 > form3 skal være form4 nu.. så derfor:
procedure Tform1.TjekNyeMsg(); var presults: pmysql_res; //results structure *pointer prow: pmysql_row; //row structure *pointer i, i2: Integer; //Counter vars query, query2: String; forme : TList; begin query:= 'select * from rachid_chat_delphi where modtager="' + form1.nick.caption + '" and ny="1"'; //Query text presults:= nil; try mysql_query(@mysqlrec, PChar(query)); //Send Query to server presults:= mysql_store_result(@mysqlrec); //Store results locally if presults^.row_count <> 0 then begin for i:= 1 to presults^.row_count do begin prow:= mysql_fetch_row(presults); for i2 := 0 to Pred(forme.Count) do if TForm4(forme.List^[i2]).BrugerNavn = prow[1] then begin Form4.msg.lines.add(prow[1] +' siger:'); Form4.msg.lines.add(' ' + prow[3]); Break; end; {with TForm4.Create(NIL) do begin modtager.text := prow[1]; query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"'; mysql_query(@mysqlrec, PChar(query2)); //Send Query to server Show; end;} end; // i end; finally mysql_free_result(presults); //release the stored results from memory end; end;
MyForm4 := TForm4.Create(Self); with MyForm4 do begin modtager.text := prow[1]; query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"'; mysql_query(@mysqlrec, PChar(query2)); //Send Query to server Show; end;
Er det det der er problemet? Jeg føler nemlig ikke at jeg er helt med endnu...
jamen altså.. jeg vil have at den opretter et nyt vindue hvis et vindue til netop denne person (afsenderen) ikke allerede er oprettet... HVIS det er oprettet skal den blot indsætte beskeden i msg.lines.add
jamen.. jeg kom til at tænke på .. er det ikke totalt umuligt at gøre det på den måde?! der må vel være en anden måde at gøre det på.. for.. man kan jo heller ikke liiige have en masse booleans til at ligge og flyde.. eller hva?
Den skal erklæres under Form1, da du kalder den under fra form1! ;)
Den kunne også ligge under public, så kan de andre forme også se den... Ellers kan du også gøre dem helt globale og lægge dem i et var-afsnit... Så kan alle forme finde dem uden at skulle kalde dem som vars fra en anden form... ;)
hvorfor ikke bare lægge en property på TForm3, der hedder brugernavn. Så kan du løbe listen eller arrayet igennem, og tjekke alle de oprettede formes brugernavn, og derved finde ud af om der findes en form til den bruger. Se tidligere indlæg.
>>nico22 Du har sgu ret... Jeg sad selv og overvejede det på et tidspunkt, men kom fra det igen... Det letteste er nok at sætte en property på den, og så skrive den rigtige kode...
>>well_r Har du prøvet at lave en property, for så tror jeg helt klart at det er det smarteste!
procedure Tform1.TjekNyeMsg(); var presults: pmysql_res; //results structure *pointer prow: pmysql_row; //row structure *pointer i,i2: Integer; //Counter vars query, query2: String; fundet : integer; begin query:= 'select * from rachid_chat_delphi where modtager="' + form1.nick.caption + '" and ny="1"'; //Query text presults:= nil; try mysql_query(@mysqlrec, PChar(query)); //Send Query to server presults:= mysql_store_result(@mysqlrec); //Store results locally if presults^.row_count <> 0 then begin for i:= 1 to presults^.row_count do begin prow:= mysql_fetch_row(presults); if vinduer.Items.count > 0 then for i2 := 0 to vinduer.items.count do begin if vinduer.Items[i2] <> prow[1] then fundet := 1; end else fundet := 0; if fundet = 1 then with TForm4.Create(NIL) do begin modtager.text := prow[1]; query2 := 'UPDATE rachid_chat_delphi SET ny="0" where id="' + prow[0] + '"'; mysql_query(@mysqlrec, PChar(query2)); //Send Query to server Show; end; end; // i end; finally mysql_free_result(presults); //release the stored results from memory end; end;
er ved at miste tålmodigheden.. :( kan du/I se hvad problemet er her? > meningen er at den skal tjekke om brugernavnet findes i vinduer.items > hvis ja > så skal den ikke gøre noget.. hvis nej.. så skal den oprette et vindue
Det der med "fundet" har jeg lige sat ind.. det virker måske ulogisk.. men sig endelig til..
som hermandsen rigtigt siger, gør det tingende nemmere hvis man bryder en kompleks metode op i mindre overskuelige opgaver. Du kan f.eks. lave en metode der hedder FindesBruger();
function FindesBruger(const ANavn: string) : Boolean; var i : Integer; begin Result := False;
for i := 0 to vinduer.Items.Count - 1 do if vinduer.Items[i] = ANavn then begin Result := True; Break; end; end;
god idé :) men jeg brugte sq en lidt anden metode og det virker nu.. sååå jeg vil nok give mig lidt tid før jeg går tilbage og ændrer det.. hehe NICO22.. lav et svar så jeg også kan acceptere dit svar :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.