Autor Beitrag
Sithlord
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: Mo 05.04.10 18:33 
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?

ausblenden 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 05.04.2010 um 23:00
>M@steR<
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: Mo 05.04.10 19:31 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:39, insgesamt 1-mal bearbeitet
Sithlord Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: 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:
www.delphipraxis.net/post387475.html

Zitat daraus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  ts: TTabSheet;
  memo: TMemo;
begin
  with PageControl do begin
    // PageControl.OnChanging()
    ts := Pages[TabIndex];
    memo := ts.Controls[0as TMemo;   

    // PageControl.OnChange()
    memo := ActivePage.Controls[0as TMemo;
  end;


Nachdem ich mir diesen code angepasst hatte, klappte es dann auch einwandfrei!
Vielen Dank!
Sithlord Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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
ausblenden 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:
dl.dropbox.com/u/563...lphi/chat_client.exe
dl.dropbox.com/u/563...lphi/chat_server.exe

Ich hoffe ihr habt eine Lösung parat, da ich an diesem Problem schon 2 Stunden verzweifel.

Mfg
>M@steR<
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 288
Erhaltene Danke: 3



BeitragVerfasst: Di 06.04.10 20:28 
Gelöscht


Zuletzt bearbeitet von >M@steR< am Di 17.09.13 02:39, insgesamt 1-mal bearbeitet
Sithlord Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: 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
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 172



BeitragVerfasst: 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 ^^