Zitat von
Tim Henford:
Also ich lasse die Forms jetzt folgendermaßen erstellen:
Delphi-Quellcode:
var
formen : array [1..5] of TForm1;
AnzForm : integer;
procedure THauptForm.StartBtnClick(Sender: TObject);
begin
AnzForm:= AnzForm+1;
formen[AnzForm]:= TUmbauten.Create(nil);
formen[AnzForm].Left:= pos.X; formen[AnzForm].Top:= pos.Y;
formen[AnzForm].Tag:= AnzForm;
formen[AnzForm].Show;
end;
- Und wenn ich den StartBtn 6x drücke?
- Wieso definierst du ein Array mit TForm1 Elementen um dann TUmbauten zu zu weisen? Warum nicht gleiche ein Array mit TUmbauten?
Zitat von
Tim Henford:
Form1 sieht dann so aus, die nächsten Fenster sollen sich alle neben das erste Reihen und wenn sich das erste bewegt sollen alle mitziehen:
Delphi-Quellcode:
...
private
procedure WMMove(var Message: TWMMove); MESSAGE WM_MOVE;
procedure AlignForm;
....
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AnzForm:= AnzForm-1;
end;
procedure TForm1.WMMove(var Message: TWMMove);
begin
inherited;
try // hier hängt er dann
if Assigned(formen[Form1.Tag]) then begin
AlignForm;
end;
except
end;
end;
procedure TForm1.AlignForm;
begin
formen[Form1.Tag].Left := formen[formen[Form1.Tag]-1].Left + formen[formen[Form1.Tag]-1].Width;
formen[Form1.Tag].Top := formen[formen[Form1.Tag]-1].Top;
end;
das zugreifen auf "Tag" funktioniert hier so nicht, hat da jemand eine Lösung
- Du prüfst mit assigned() auf <> nil in der WMMove Botschaftsbehandlung, aber setzt nirgendwo beim Schließen einer Form deren Eintrag auf nil.
- Du fragst den Tag ab - aber wo setzt du diesen denn? Tag ist standardmäßig 0 und von daher ist der Zugriff auf dein formen[] Array ungültig mit einem Index von 0. Das du noch fragst warum das nicht klappt, zeigt mir, dass du die Bereichs- und Überlaufprüfung nicht eingeschaltet hast in dem Projekt. Bitte hole dies sofort nach (Projektoptionen -> Compiler) und erstelle das Projekt komplett neu.
- Du benutzt excessiv Form1, somit stellt sich für mich die Frage, ob diese globale Variable überhaupt eine gültige Instanz hat.
- Warum fragst du in der WMMove Botschaftsbehandlung nicht ab, ob du dich überhaupt in der Form1 befindest, oder willst du alle Fenster als gesamtes Verschieben, egal welches gezogen wird? Wenn ja, dann musst du den Code überarbeiten.
- Du greifst bei AlignForm immer auf den Form1.Tag-ten Eintrag in dem formen[] Array zu. Aber ich dachte die Methode soll auch alle anderen Formulare nachziehen - wo geschieht dies? So kommt es mir so vor, als wenn du in der AlignForm alle Zugriffe auf "formen[Form1.Tag]" mit "Self" ersetzen könntest.
/EDIT: roter Kasten?