Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamische Fenster und deren zuordnung (https://www.delphipraxis.net/138277-dynamische-fenster-und-deren-zuordnung.html)

Novo 6. Aug 2009 14:07


Dynamische Fenster und deren zuordnung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Und zwar geht es nach dem hier:
http://www.delphipraxis.net/internal....php?p=1066031
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:
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;
Allerdings, wie prüfe ich, ob panel_UIN schon existiert?
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]

stahli 6. Aug 2009 14:55

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...

Novo 6. Aug 2009 15:40

Re: [HELP?] Dynamische Fenster und deren zuordnung
 
Zitat:

Zitat von stahli
Vielleicht geht es mit einem TabControl einfacher...
Da verwendest Du die selben "internen" Controls und weist diesen einfach bei einem Tabwechsel andere Verbindungsdaten zu...

TabControl?
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)


http://img5.imagebanana.com/img/7m5xc7cz/tab.png

DeddyH 6. Aug 2009 15:46

Re: [HELP?] Dynamische Fenster und deren zuordnung
 
Du könntest das TabSheet entweder über FindComponent suchen oder gleich alle in einer TObjectList verwalten.

Novo 6. Aug 2009 15:47

Re: [HELP?] Dynamische Fenster und deren zuordnung
 
Zitat:

Zitat von DeddyH
Du könntest das TabSheet entweder über FindComponent suchen oder gleich alle in einer TObjectList verwalten.

über FindComponent hab ich schon die funktion "GetActiveRichEdit" gemacht, wär ne idee ...

Novo 7. Aug 2009 08:52

Re: Dynamische Fenster und deren zuordnung
 
Ich hab jetzt noch ein Problem:

Delphi-Quellcode:
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;
ganz am Ende das:
Delphi-Quellcode:
frmChat.CurrentRichEdit.Lines.Add(AktuelleUIN + ': ' + Msg);
Das ist falsch, so kommt die msg eines anderen users in ein falsches RichEdit eines anderen Users,
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?

DeddyH 7. Aug 2009 09:05

Re: Dynamische Fenster und deren zuordnung
 
Hatte ich mich so unklar ausgedrückt? Schau mal, wie man FindComponent anwendet.

Novo 7. Aug 2009 10:44

Re: Dynamische Fenster und deren zuordnung
 
Zitat:

Zitat von DeddyH
Hatte ich mich so unklar ausgedrückt? Schau mal, wie man FindComponent anwendet.

Hab ich doch, funktioniert nicht so wie ich will.

Delphi-Quellcode:
TRichEdit(findcomponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
Das Problem wird wohl daran liegen, dass ich den Code oben auf frmMain anwende, die gesuchte Komponente sich aber auf frmChat befindet.

Delphi-Quellcode:
TfrmMain.TRichEdit(findcomponent('frmMain.edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
oder
Delphi-Quellcode:
TRichEdit(findcomponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
geht aber nicht.


EDIT:
Eigentlich müsste es jetzt so gehen:
Delphi-Quellcode:
TRichEdit(frmChat.FindComponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
aber ich bekomme dann eine Zugriffsverletzung.

und wenn ich:
Delphi-Quellcode:
if frmChat.FindComponent('edtChat_' + AktuelleUIN) as TRichEdit <> nil
then
TRichEdit(frmChat.FindComponent('edtChat_' + AktuelleUIN)).Lines.Add(AktuelleUIN + ': ' + Msg);
mache, findet er sie trotzdem nicht.
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;

DeddyH 7. Aug 2009 10:53

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;

Novo 7. Aug 2009 10:58

Re: Dynamische Fenster und deren zuordnung
 
Zitat:

Zitat von DeddyH
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;

leider nein.
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 06:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz