Autor Beitrag
KillA
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.07.02 10:16 
Hallo,
zur Zeit programmiere ich ein IRC Programm, dass wie die meisten aus mehreren Forms besteht. Das Serverfenster (form2) wird dupliziert und wird somit zum Chatfenster, der Name wird in die jeweiligen Channelnamen umbenannt.

Jetzt habe ich das Problem, dass wenn die TClientSocket einen Text erhält, in dem der Channelname an 2. oder 3. Stelle vorkommt, ich diesen nicht an die entsprechende Form schicken kann.
Für die Sichtbarkeit des Textes habe ich eine Memo genommen.

Wie schicke ich den Text an die einzelnen Memos in den Forms?
Vielen Dank für mögliche Antworten
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 18.07.02 10:24 
Hallo,

du wirst doch wenn ein User einen Channel öffnet dies irgendwo vermerken (z. B. in einer TList)? Dann kannst Du doch wenn einen Nachricht kommt die tList durchgehen und schauen ob das entsprechende Fenster diese Nachricht haben möchten.

Gruß
TINO
KillA Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.07.02 10:34 
Das Problem ist, dass ich die einzelnen Forms danach nicht mehr ansprechen kann.

ausblenden Quelltext
1:
2:
3:
4:
5:
//Das Ereignis tritt ein, wenn der User /join eingibt.
with tform2.Create(self) do begin
   Name := channel;
   Caption := channel;
end;

channel ist dabei natürlich der Channelname, der vorher rausgefiltert wird.
Sagen wir, der Channel, dem der User joint, heisst #test.
Dann ist der Name und die Caption 'test' (ohne #). Wenn ich aber später z.B. channel.memo1.lines.add() aufrufen will, klappt das nicht, weil ihm 'channel' nicht bekannt ist, bzw nicht als Form anerkannt wird.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 18.07.02 11:28 
Hi!

So hängen die Forms tatsächlich einfach so in der Luft. Du musst dir die Forms, wie Tino schon sagte, in einer Liste (also ein TList-Objekt) merken:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var i:integer;
var MyForm:tform2;
begin
  //Formular erstellen
  MyForm:=tform2.Create;
  //Zeiger auf Formular in Liste ablegen
  Formlist.Add(MyForm);
  //Name und Caption setzen
  with MyForm do
  begin
   Name := channel; 
   Caption := channel; 
  end;
end;

Später kannst du dann durch die Liste auf deine Formulare zugreifen:

Dieses Beispiel gibt den Namen des ersten Forms (Index 0) aus:
ausblenden Quelltext
1:
  ShowMessage(tform2(Formlist[0]).Name);					


Cu,
Udontknow

PS: Wenn später Fenster geschlossen und freigegeben werden, musst du natürlich auch den Eintrag aus der Liste entfernen...
KillA Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.07.02 11:43 
Vielen Dank.

Ich glaube ich weiss jetzt wo der Fehler war.
Ich habe vorher eine TListBox genommen und da waren nur Captions zugelassen.

Das mit dem Pointer werde ich sofort ausprobieren.

Cu,
Alex
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Do 18.07.02 12:02 
KillA hat folgendes geschrieben:
Ich habe vorher eine TListBox genommen und da waren nur Captions zugelassen.
Habe ich Dich richtig verstanden? Du hast auf Deinem Hauptform einen Listbox in der alle Channels jeweils durch einen Eintrag eingetragen sind? Dann wird es wahrscheinlich so sein das Du bei einem (Doppel-)Klick auf einem Eintrag das entsprechende Fenster öffnest. Ist das soweit richtig?

Dann könntest Du die Listbox oder besser gesagt die StringList die da drin steckt dafür "missbrauchen". Das heißt wenn Du auf einen ListBox-Eintrag klickst und dann das Fenster öffnest könntest Du in dem ListBox-Eintrag einen Verweiss auf dieses Fenster "speichern".

Jeder Eintrag in der Listbox kann nicht nur einen Text beinhalten sondern auch einen tObject. Schau mal in der Hilfe unter tStrings nach und dann unter Eigenschaften. Da siehst Du nicht nur die Eigenschaft Strings sondern auch Objects.

Wenn Du nun ein Eintrag doppelt geklickt wird sieht Dein Event ungefähr so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ListBox1DblClick(Sender: TObject);
Var
  Form: tForm2;
begin
  Form := tForm2.Create (Self);
  ListBox1.Items.Objects [ListBox1.ItemIndex] := Form;
  {...}
end;
Wenn nun eine Nachricht rein kommt suchst Du halt in der Listbox nach dem Channel und dadruch bekommst Du dann auch das entsprechende Form. Wenn natürlich das Object hinter dem Form nil ist hat der User noch kein Fenster für diesen Channel geöffnet und Du kannst Die Nachricht ignorieren.

Gruß

Gruß
KillA Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.07.02 12:12 
Nunja, nicht direkt. Die Fenster werden weiterhin nur durch '/join #channel' geöffnet. Die Listbox war nur dazu, um wie du sagtest die Namen zu speichern.

Ebenfalls thx.