Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - In dynamische Listbox einen eintrag hinzufügen
Sithlord - Mo 05.04.10 18:33
Titel: In dynamische Listbox einen eintrag hinzufügen
Hallo Delphianer,
ich wage mich grad an nen kleinen Chat in Delphi, welche eine Tabsheet dynamisch erstellt und darin eine dynamische Listbox = für jeden user, welcher mit mir redet halt etwas, um die Nachrichten sehen zu können.
Nun habe ich ein Problem.
Ich weiß den Namen der listbox beim proggen ja nicht, ich muss aber zur laufzeit die Listbox füllen können.
Wie stelle ich das an?
Delphi-Quelltext
1: 2: 3: 4: 5:
| tabSheet := TTabSheet.Create(nil); tabSheet.PageControl := chatpage; tabsheet.Caption:= rtext[1]; listbox:=tlistbox.Create(nil); listbox.Parent:=tabsheet; |
So lasse ich die Listbox erstellen (Kleiner Auszug).
Diese lässt sich, würde ich da nun Befehle ranhängen, auch beschreiben und alles verändern.
Angenommen, ich würde irgendwann später mithilfe eines Buttons in eine bestimmte, existierende Listbox etwas reinschreiben wollen, wie stelle ich das an?
Mfg
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 05.04.2010 um 23:00
>M@steR< - Mo 05.04.10 19:31
Gelöscht
Sithlord - Mo 05.04.10 19:36
Ah, danke dir!
Super Forum hier, habe aber natürlich weitergegooglet und vor 1 Min diese Lösung gefunden:
http://www.delphipraxis.net/post387475.html
Zitat daraus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var ts: TTabSheet; memo: TMemo; begin with PageControl do begin ts := Pages[TabIndex]; memo := ts.Controls[0] as TMemo;
memo := ActivePage.Controls[0] as TMemo; end; |
Nachdem ich mir diesen code angepasst hatte, klappte es dann auch einwandfrei!
Vielen Dank!
Sithlord - Mo 05.04.10 22:44
Mist, so ganz geht das aber noch nicht.
Wenn ich den Client 2mal öffne und dann gegenseitig mit jeweils unterschiedlichen Accounts anmelde und mir dann schreiben möchte, kommt es vor, das beim Absenden einer nachricht bei Client1 diese im aktuellen Nachrichtenfenster bei Client1 nicht angezeigt wird...
Genauso kann es sein, das wenn Client2 eine Nachricht an Client1 schreibt, Client1 diese nicht angezeigt bekommt, diese aber bei Client2 im aktuellen Nachrichtenfenster stehen hat.
Das "+2" musste ich bei dem Findcomponent einfügen, da sonst gar keine Nachricht im Fenster angezeigt wurde. Welche Anomalie ist dafür verantwortlich, bzw. wie kann ich das wieder loswerden?
Hier die entsprechenden Codes:
Code1 -> Wenn der Server eine Nachricht an den Client sendet (Format: rtext[0]= Art des ankommen strings (z.b. Neue Nachricht), rtext[1]= Name des Users, welcher einem Schrieb, rtext[2]= ist der Text, der geschrieben wurde.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| if (rtext[0]='newmsgs')then begin add:=true; for i:=0 to chatpage.PageCount-1 do begin if (chatpage.Pages[i].Caption=rtext[1])then begin i2:=i; add:=false; end; end; if (add=true)then begin tabSheet := TTabSheet.Create(nil); tabSheet.PageControl := chatpage; tabsheet.Caption:= rtext[1]; listbox:=tlistbox.Create(nil); listbox.Parent:=tabsheet; listbox.Align:=alclient; listbox.Name:='chat'+IntToStr(chatpage.PageCount+1); listbox.Items.Add('Du redest jetzt mit: '+tabsheet.Caption); listbox.Items.Add('----------------------------------------'); listbox.items.add('['+TimeToStr(Time)+'] Von '+rtext[1]+': '+rtext[2]); chatpage.ActivePage:=tabsheet; end else begin chatpage.ActivePageIndex:=i2; if chatpage.FindComponent('chat'+IntToStr(i2+2)) as Tlistbox<> nil then TListBox(chatpage.FindComponent('chat'+IntToStr(i2+2))).Items.Add('['+TimeToStr(Time)+'] Von '+rtext[1]+': '+rtext[2]); end; |
Code2 -> Wenn man einen User aus der Userlist anschreiben möchte (Es wird ein neuer Tabsheet geöffnet, worin man diesen User halt anschreiben kann:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.friendslistClick(Sender: TObject); var i,i2:integer; add:boolean; tabSheet : TTabSheet; listbox : Tlistbox; begin add:=true; for i:=0 to chatpage.PageCount-1 do begin if (chatpage.Pages[i].Caption=friendslist.Items.Strings[friendslist.itemindex])then begin i2:=i; add:=false; end; end; if (add=true)then begin tabSheet := TTabSheet.Create(nil); tabSheet.PageControl := chatpage; tabsheet.Caption:= friendslist.Items.Strings[friendslist.itemindex]; listbox:=tlistbox.Create(chatpage); listbox.Name:='chat'+IntToStr(chatpage.PageCount+1); listbox.Parent:=tabsheet; listbox.Align:=alclient; listbox.Items.Add('Du redest jetzt mit: '+tabsheet.Caption); listbox.Items.Add('----------------------------------------'); chatpage.ActivePage:=tabsheet; end else chatpage.ActivePageIndex:=i2; end; |
Code3 -> Wenn der Client eine Nachricht zum anderen user absendet
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button3Click(Sender: TObject); var tabSheet : TTabSheet; listbox : Tlistbox; begin try if (chatpage.ActivePageIndex>=0)AND (edit4.text>'')then begin sendit.Items.Add('login|'+edit1.text+'|'+edit2.Text+'|sendmsg|'+chatpage.Pages[chatpage.ActivePageIndex].caption+'|'+edit4.text); if chatpage.FindComponent('chat'+IntToStr(chatpage.ActivePageIndex+2)) as Tlistbox<> nil then Tlistbox(chatpage.FindComponent('chat'+IntToStr(chatpage.ActivePageIndex+2))).items.add('['+TimeToStr(Time)+'] Von Dir: '+edit4.text);
end; edit4.Text:=''; except end; end; |
Die try / except Sache hab ich drin, damit es nicht sofort Fehler wirft. Die Einrückung ist (noch) nicht so perfekt, werde ich aber noch nachholen. Wenn jemand noch den Client oder den Server braucht, diese sind hier angehängt:
http://dl.dropbox.com/u/5639348/delphi/chat_client.exe
http://dl.dropbox.com/u/5639348/delphi/chat_server.exe
Ich hoffe ihr habt eine Lösung parat, da ich an diesem Problem schon 2 Stunden verzweifel.
Mfg
>M@steR< - Di 06.04.10 20:28
Gelöscht
Sithlord - Mi 14.04.10 19:45
Schade... Ich habe mal ein bisschen experimentiert. Es kommt an das richtige Tabsheet an, das Problem ist, das es nicht in die richtige Listbox reingeschrieben wird -.-
Irgendwie weichen die Listboxnamen voneinander ab. Und ich weiß nicht warum.
Naja, schon wieder ein programm, was ich als nicht machbar abstempeln kann.
Vielleicht in 10 Jahren ;)
Roffel - Do 15.04.10 20:34
Wieso chatpage.FindComponent? Mach doch chatpage.ActivePage.FindComponent und dann setz listbox.Name:='chat' ohne Nummer.
Prinzipiell sollte das mit den Tabsheets klappen. Wenn du dir im Code irgendwo nicht ganz sicher bist, wie etwas funktioniert, solltest du aber erst eine kleine Test Applikation schreiben und dann gucken, obs da klappt. Falls dann etwas nicht geht, bekommst du hier wohl auch viel schneller ne Antwort bei einem überschaubaren Problemchen als wenn du x Sachen in ein grösseres Programm reinflickst. Da kann nämlich alles mögliche schiefgehen.
Sithlord - Mi 21.04.10 21:41
Ok, nein das Programm wurde langsam aufgebaut, mehrmals umgebaut. Erst pure kleine Kommunikation, danach ein massenchat und nun der übergang zum Einzelchat ;)
Aber ich werde das mal probieren wie du meinst und das schon irgendwie hinbekommen,
Danke trotzdem ;)
Man darf den Mut halt nicht verlieren ^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!