Autor Beitrag
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.09.04 20:11 
Hallo,
bin dabei einen Chat zu programmieren und brauche ne kleine Hilfestellung. Das Problem liegt beim dynamischen Erstellen selbst deklarierter Forms. Ihr müsst euch das wie bei ICQ vorstellen, wo für jede Session ein eigenes Chat-Window angelegt wird.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
 TChatForm = class(TForm)
  Memo1, Memo2: TMemo;
  btnSend, btnClose: TButton;
  ...
  constructor Create;
  destructor Destroy;
end;


Nun möchte ich bei TChatForm1.create; auch gleich alle Memos, Buttons etc. erzeugen und sie auf der Form anordnen. Nur das bekomme ich irgendwie nicht hin. Bisher sieht mein Constructor so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
constructor TChatForm.Create;
begin
 inherited create(nil);
 Memo1 := TMemo.Create;
 Memo1.Left := 10
 ...
 Show;
end;


Ich weiß, dass das ziemlicher Murks ist, aber ich bekomme es einfach nicht hin, durch ein simples ChatForm1 := TChatForm.create; mein gewünschtes Chat-Window auf den Screen zu kriegen.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 24.09.04 08:05 
Normalerweise benötigt man den Constructor und Destructor nicht selbst zu programmieren.
Lass das mal weg und schreibe einfach
ausblenden Quelltext
1:
TChatForm.Create(nil);					
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 24.09.04 08:29 
Habe ich das richtig verstanden, Du hast die Typendeklaration da oben selbst geschrieben?

Wenn ja, dann musst Du den Komponenten nicht nur Position und Eigenschaften im Create zuweisen, sondern auch den Parent (das sollte das Form selbst sein), damit die Komponente richtig angezeigt wird.

Hast Du es mit dem Designer gemacht, dann brauchst Du den Konstruktor nicht selbst schreiben, wenn alle Kompos ordentlich angeordnet sind (wie schon gesagt wurde).
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 24.09.04 19:12 
Als sinnvollstes empfehle ich dir:
1. mit Delphi ein Formular zu erstellen.
2. Die automatischen Erzeugung zu entfernen. (Projektoptionen oder aus dem dpr)
3. Dessen Variable aus seiner Unit zu entfernen.

Das bei bedarf mittels "Instanze := TMyLittleFunnyForm.Create(nil);" zu erstellen. Beim Schließen des Forms das Freigeben bitte nicht vergessen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.09.04 19:14 
UGrohne hat folgendes geschrieben:
Habe ich das richtig verstanden, Du hast die Typendeklaration da oben selbst geschrieben?

Ja, die wurde von mir selbst abgetippt.

Ich möchte das Problem jetzt noch mal der Reihe nach schildern:
1. Ich deklariert manuell TChatForm z. B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TChatForm = class(TForm)
    Memo1: Tmemo;
  end;


2. Ich deklarier ne die Instanz ChatForm1 global:
ausblenden Delphi-Quelltext
1:
2:
var
 ChatForm1: TChatForm;


3. Ich rufe den Constructor auf und versuche so ChatForm1 zu erstellen:
ausblenden Delphi-Quelltext
1:
ChatForm1 := TChatForm.create(nil);					


Beim dritten Schritt bekomme ich dann eine EResNotFound:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EResNotFound aufgetreten. Meldung: 'Ressource TChatForm wurde nicht gefunden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK   Hilfe   
---------------------------


Im Moment kommt es mir gar nicht auf die Komponenten von TChatForm an, sondern nur, dass sieüberhaupt erzeugt wird. Wo liegt mein Fehler?
Anfänger
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP
D3 Prof
BeitragVerfasst: Fr 24.09.04 19:52 
Warum machst du dir das so umständlich die Form durch den Text zu erstellen? Machs doch viel einfacher mit "Datei>Neues Formular".
Dadurch wird das wichtigste automatisch erstellt. Änderungen kannst du doch immernoch im Quelltext vornehmen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 24.09.04 21:57 
Delphi legt seine Formulardaten (die Eigenschaften des Formulars und deren Kinder) in der *.dfm ab. Wenn du es erstellen möchtest, dann versucht er die als Resource eingebundene dfm zu laden. Was natürlich nicht klappt, da sie ja nicht existiert. Du müsstest wenn dann direkt ein TForm instanziieren und dort dann die Elemente auch alle dynamsich erzeugen. Es ist allerdings wesentlich einfacher, wenn du in Delphi ein Formular erstellst und dieses dann benutzt!!!

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Elite
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.09.04 23:05 
Anfänger hat folgendes geschrieben:
Machs doch viel einfacher mit "Datei>Neues Formular".

Lossy eX hat folgendes geschrieben:
Es ist allerdings wesentlich einfacher, wenn du in Delphi ein Formular erstellst und dieses dann benutzt!!!


Ihr habt ja recht, ich habs inzwischen auch festegestellt :?
Schönen Dank für eure Bemühungen, Problem gelöst.