![]() |
Dynamische Fenster und deren zuordnung
Liste der Anhänge anzeigen (Anzahl: 1)
Und zwar geht es nach dem hier:
![]() mit meinen Problemen weiter. Ich will ein eigenes, kleines ICQ Client schreiben und will nicht jedesmal (MSG empfangen / Nachricht schreiben) ein NEUES Fenster aufmachen, sondern nur EIN Fenster mit Dynamischen Tabs haben. Das habe ich teilweie hinbekommen, allerdings funktioniert das nicht einwandfrei. Und zwar: wenn neue Nachricht reinkommt oder ich eine neue nachricht schreiben will: ICQ UIN nehmen, daraus panel_UIN dynamisch erzeugen und anzeigen.
Delphi-Quellcode:
Allerdings, wie prüfe ich, ob panel_UIN schon existiert?
procedure TfrmMain.lstBoxKontakteDblClick(Sender: TObject);
var newTabSheet: TTabSheet; newRichEdit: TRichEdit; newPanel: TPanel; newlabel: TLabel; aItem: TListItem; begin if lstBoxKontakte.Selected = nil then Exit; aItem := lstBoxKontakte.Selected; AktuellerNICK := aItem.Caption; AktuelleUIN := aItem.SubItems[0]; try newTabSheet := TTabSheet.Create(frmChat.PageControlChat); newTabSheet.Caption := AktuellerNICK; newTabSheet.Name := 'tab_' + AktuelleUIN; newTabSheet.PageControl := frmChat.PageControlChat; newTabSheet.Parent := frmChat.PageControlChat; frmChat.PageControlChat.ActivePage := newTabSheet; newRichEdit := TRichedit.Create(newTabSheet); TWinControl(newRichEdit).Name := 'edt_' + AktuelleUIN; TWinControl(newRichEdit).Parent := newTabSheet; newRichEdit.Align := alClient; newPanel := TPanel.Create(newTabSheet); TWinControl(newPanel).Name := 'panel_' + AktuelleUIN; TWinControl(newPanel).Parent := newTabSheet; TWinControl(newPanel).Height := 30; newPanel.Align := alTop; newLabel := TLabel.Create(newPanel); TWinControl(newLabel).Name := 'labelNICK_' + AktuelleUIN; TWinControl(newLabel).Parent := newPanel; newLabel.Align := alTop; newLabel := TLabel.Create(newPanel); TWinControl(newLabel).Name := 'labelUIN_' + AktuelleUIN; TWinControl(newLabel).Parent := newPanel; newLabel.Align := alBottom; except //Wenn nicht erzeugbar -> schon vorhanen -> dann will ich zu dem Tab switchen //GEHT NICHT! Variable 'newTabSheet' ist nicht initialisiert worden frmChat.PageControlChat.ActivePage := newTabSheet; // .ActivePage := 'tab_' + AktuelleUIN; geht NICHT! end; if frmChat.Showing = false then frmChat.Show; end; wenn NEIN -> wie oben erzeugen und öffnen wenn JA -> Diesen Tab aktiv machen (wie?) Ausserdem muss ich ja die MSG dann an den RICHTIGEN senden, deshalb habe ich auch labelUIN und labelNICK erzeugt, wo die aktuelle Daten des aktiven Tabs drinstehen. die müsst ich dann ja nur auslesen udn an die labelUIN schicken. Dann habe ich Dynamische Tabs mit einem schliessen Button erzeugt, allerdings lässt sich das nur von Unit/Form 2 aus erzeugen, nicht von Unit/Form1 (NACH dem Public machen) aber seht selbst, hier ist alles was ihr braucht zum nachvollziehen: --- Mag mir einer vielleicht bei dem Projekt am Wochenende ein wenig per ICQ helfen? Dynamische Tabs und deren Steuerung/verwalung [edit=SirThornberry]Titel geändert - Hilfe braucht wohl jeder der in dieser Kategorie postet und sagt nichts über das Problem selbst aus :-) Mfg, SirThornberry[/edit] |
Re: [HELP?] Dynamische Fenster und deren zuordnung
Vielleicht geht es mit einem TabControl einfacher...
Da verwendest Du die selben "internen" Controls und weist diesen einfach bei einem Tabwechsel andere Verbindungsdaten zu... |
Re: [HELP?] Dynamische Fenster und deren zuordnung
Zitat:
mmh hab jetzt aber alles mit TPageControl gemacht. Bisher geht eigentlich alles, bis auf die gute/saubere Art und weise, dem Tab nen Namen zu geben bzw. zu speichern, Damit ich beim Empfangen / Senden der Nachricht weiss, Tab_X = Kontakt_Y und der hat ICQ Nummer UIN_Z Und dann wäre da nochwas zu klären... 1. Wenn ich schliesse, ist der RichEdit Chatlog WEG, das doof ... (History speichern oder doch nur hide anstelle von close?) 2. Überprüfung von schon erzeugten Tabs. Wenn Tab mit tab_ICQUIN_X schon erzeugt ist -> Active Page Control -> tab_ICQUIN_X (leider kann ich NICHT: PageControlChat.ActivePage := tab_ICQUIN_X (name als string) machen :( und wenn noch nicht erzeugt -> erstellen (.create) ![]() |
Re: [HELP?] Dynamische Fenster und deren zuordnung
Du könntest das TabSheet entweder über FindComponent suchen oder gleich alle in einer TObjectList verwalten.
|
Re: [HELP?] Dynamische Fenster und deren zuordnung
Zitat:
|
Re: Dynamische Fenster und deren zuordnung
Ich hab jetzt noch ein Problem:
Delphi-Quellcode:
ganz am Ende das:
procedure TfrmMain.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
var newTabSheet: TTabSheet; newRichEdit: TRichEdit; newPanel: TPanel; newlabel: TLabel; aItem: TListItem; i: integer; begin AktuelleUIN := UIN; AktuellerNICK := AktuelleUIN; for i := 0 to lstBoxKontakte.Items.Count-1 do begin aItem := lstBoxKontakte.Items[i]; if aItem.SubItems[0] = AktuelleUIN then AktuellerNICK := aItem.Caption; end; try newTabSheet := TTabSheet.Create(frmChat.PageControlChat); newTabSheet.Caption := AktuellerNICK; newTabSheet.Name := 'tabChat_' + AktuelleUIN; newTabSheet.PageControl := frmChat.PageControlChat; newTabSheet.Parent := frmChat.PageControlChat; frmChat.PageControlChat.ActivePage := newTabSheet; frmChat.ShowTabButton(newTabSheet.PageIndex); frmChat.ReCalculateButtonPositions; newRichEdit := TRichedit.Create(newTabSheet); TWinControl(newRichEdit).Name := 'edtChat_' + AktuelleUIN; TWinControl(newRichEdit).Parent := newTabSheet; newRichEdit.Align := alClient; newPanel := TPanel.Create(newTabSheet); TWinControl(newPanel).Parent := newTabSheet; TWinControl(newPanel).Height := 28; newPanel.Align := alTop; newLabel := TLabel.Create(newPanel); TWinControl(newLabel).Name := 'NICK_' + AktuelleUIN; TWinControl(newLabel).Parent := newPanel; newLabel.Align := alLeft; //Platzhalter zwischen NICK und UIN newLabel := TLabel.Create(newPanel); TWinControl(newLabel).Parent := newPanel; newLabel.Align := alLeft; newLabel := TLabel.Create(newPanel); TWinControl(newLabel).Name := 'UIN_' + AktuelleUIN; TWinControl(newLabel).Parent := newPanel; newLabel.Align := alLeft; except // end; //BUG: Curret Richedit ist falsch! -> 'edtChat_' + AktuelleUIN.Lines.Add frmChat.CurrentRichEdit.Lines.Add(AktuelleUIN + ': ' + Msg); if frmChat.Showing = false then frmChat.Show; end;
Delphi-Quellcode:
Das ist falsch, so kommt die msg eines anderen users in ein falsches RichEdit eines anderen Users,
frmChat.CurrentRichEdit.Lines.Add(AktuelleUIN + ': ' + Msg);
eben weil ein anderes gerade aktiv ist. Man müsste sagen können:
Delphi-Quellcode:
var
name : string; name := 'edtChat_' + AktuelleUIN //und dann: frmChat.name.Lines.Add //Das geht aber nicht! //Wie kann ich den KomponentenNamen zum ansteuern benutzen? |
Re: Dynamische Fenster und deren zuordnung
Hatte ich mich so unklar ausgedrückt? Schau mal, wie man FindComponent anwendet.
|
Re: Dynamische Fenster und deren zuordnung
Zitat:
Delphi-Quellcode:
Das Problem wird wohl daran liegen, dass ich den Code oben auf frmMain anwende, die gesuchte Komponente sich aber auf frmChat befindet.
TRichEdit(findcomponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
Delphi-Quellcode:
oder
TfrmMain.TRichEdit(findcomponent('frmMain.edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
Delphi-Quellcode:
geht aber nicht.
TRichEdit(findcomponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
EDIT: Eigentlich müsste es jetzt so gehen:
Delphi-Quellcode:
aber ich bekomme dann eine Zugriffsverletzung.
TRichEdit(frmChat.FindComponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
und wenn ich:
Delphi-Quellcode:
mache, findet er sie trotzdem nicht.
if frmChat.FindComponent('edtChat_' + AktuelleUIN) as TRichEdit <> nil
then TRichEdit(frmChat.FindComponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg); Sie wurde aber 100%ig vorher erzeugt:
Delphi-Quellcode:
newTabSheet := TTabSheet.Create(frmChat.PageControlChat);
newTabSheet.Caption := AktuellerNICK; newTabSheet.Name := 'tabChat_' + AktuelleUIN; newTabSheet.PageControl := frmChat.PageControlChat; newTabSheet.Parent := frmChat.PageControlChat; frmChat.PageControlChat.ActivePage := newTabSheet; frmChat.ShowTabButton(newTabSheet.PageIndex); frmChat.ReCalculateButtonPositions; newRichEdit := TRichedit.Create(newTabSheet); TWinControl(newRichEdit).Name := 'edtChat_' + AktuelleUIN; TWinControl(newRichEdit).Parent := newTabSheet; newRichEdit.Align := alClient; |
Re: Dynamische Fenster und deren zuordnung
Nach kurzem Überfliegen des Source aus dem Ausgangspost müsstest Du IMO so vorgehen (Beispiel):
Delphi-Quellcode:
var compo: TComponent;
begin compo := frmChat.PageControlChat.FindComponent(<Name des TabSheets>); if Assigned(compo) then compo := compo.FindComponent(<Name des RichEdits>); if Assigned(compo) then (compo as TRichEdit).Lines.Add('Wuppdi'); end; |
Re: Dynamische Fenster und deren zuordnung
Zitat:
es öffnet sich zwar das Fenster, allerdings kommt keine Message an.
Delphi-Quellcode:
compo := frmChat.PageControlChat.FindComponent('edtChat_' + AktuelleUIN);
if Assigned(compo) then compo := compo.FindComponent('edtChat_' + AktuelleUIN); if Assigned(compo) then (compo as TRichEdit).Lines.Add(AktuelleUIN + ': ' + Msg); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz