Einzelnen Beitrag anzeigen

Jarmen_Kell

Registriert seit: 17. Mär 2005
188 Beiträge
 
#5

Re: Formular beliebig oft zur Laufzeit erstellen

  Alt 14. Okt 2005, 21:19
Du könntest dir auchn Knopf an die Backe nähen...

Da gesagt wurde, dass es für ein Chatprogramm ist, kann man wohl davon ausgehen, dass das ganze später noch verwendet werden muss

Projektsource:

Delphi-Quellcode:
program Formulare;

uses
  Forms,
  Main in 'Main.pas{MainForm},
  chat in 'chat.pas{ChatForm};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm); // ChatForm nicht erstellen!
  Application.Run;
end.
So nun vom MainForm
Delphi-Quellcode:
uses Chat
type PChatForm = ^ChatForm; // ein Pointer auf das Formular

type
  TMainForm = class(TForm)
...

  public
    FormListe: TList; // Eine Liste, in der die Pointer auf die Formulare gespeichert werden
    ChatPointer: PChatFormForm; // Eine Pointervariable (Definition oben)
Wenn du jetzt ein Formular erzeugen willst, musst du folgendes machen:
Delphi-Quellcode:
procedure TMainForm.CreateButtonClick(Sender: TObject);
begin
  GetMem(ChatPointer, SizeOf(TChatForm)); // An Adresse Speicher fürs Formular bereitstellen
  ChatPointer^ := TChatForm.Create(Self); // ChatForm erzeugen
  FormListe.Add(ChatPointer); // fügt den Pointer zur Liste hinzu
end;
Der Zugriff auf eines der Formulare geschieh wie folgt:
Delphi-Quellcode:
  ChatPointer := FormListe[Integer]; // Pointer auf ein Formular richten
  ChatPointer^.Caption := EditFormCaption.Text;
Da du den ganzen Speicher selber reserviert hast, musst du ihn auch wieder freigeben.
Delphi-Quellcode:
var
  i: Integer;
begin
  for i := 0 to FormListe.Count-1 do
  begin
    ChatPointer := FormListe[i];
    ChatPointer^.Hide; // Sicherheitshalber aufrufen, da es sonst zu Fehlern kommen kann
    ChatPointer^.Free;
    FreeMem(ChatPointer, SizeOf(TChatFormForm)); // Speicher wieder freigeben
  end;
  FormListe.Free;
Das waren so die trockenen Befehle.

Nun denn, da du darauf nicht selber gekommen bist, nehme ich an, dass du dich noch nicht mit dem Thema "Pointer" beschäftigt hast. Dazu würde ich dir nun raten (Ausnahme: Du willst ein CnP-Prog), dich damit intensiv zu beschäftigen. Ist anfangs schwierig zu verstehen (wozu auch selbstständiges Beherrschen gehört), aber für dein Programm unabdingbar. Hier im Forum wirst du einiges dazu finden.
  Mit Zitat antworten Zitat