Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unendliche Formen erzeugen (wenn nötig) (https://www.delphipraxis.net/7789-unendliche-formen-erzeugen-wenn-noetig.html)

Pseudemys Nelsoni 21. Aug 2003 14:25


Unendliche Formen erzeugen (wenn nötig)
 
hi,

ich habe einen irc client und möchte auch per dcc was senden/empfangen können...dasproblem ist, bei jedem neuen transfer muss auch automatisch ein neues fenster erzeugt werden, wie kann ich das machen?

Illuminator-23-5 21. Aug 2003 14:28

Re: Unendliche Formen erzeugen (wenn nötig)
 
du musst einfach eine weitere Variable vom Typ TForm1 (oder wie es bei dir heißt) erstellen. das könntest du per array machen
unendlich viele wirst du nicht erzeugen können, aber schon viele!;)

Pseudemys Nelsoni 21. Aug 2003 14:30

Re: Unendliche Formen erzeugen (wenn nötig)
 
erstmal danke für den tip, wie ich das realisiere weiss ich noch nicht, aber mal ne andere frage...nicht unendlich? mIRC kann doch auch unendlich je nach transfers erstellen oder?

MatthiasW 21. Aug 2003 14:32

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hallo,

du könntest mit:

Code:
var myForm: TForm;

myForm := TForm.CreateNew(Application);
myForm.Width := 200;
myForm.Width := 200;
myForm.Show;
dir immer wieder ein neues Formular per code erzeugen.
Natürlich solltest du alle gewünschten Eigenschaften nach deinen bedürfnissen noch anpassen.

Mfg Matthias

Pseudemys Nelsoni 21. Aug 2003 14:33

Re: Unendliche Formen erzeugen (wenn nötig)
 
moin mathias, danke für den code mal schauen. btw: kann ich damit mehrere erzeugen? ich meine "myForm" darf doch nur 1mal existieren oder?

Illuminator-23-5 21. Aug 2003 14:34

Re: Unendliche Formen erzeugen (wenn nötig)
 
Zitat:

aber mal ne andere frage...nicht unendlich?
unendlich kannst du deswegn nicht erstellen,
weil unendlich > 9999999999999999^999999999999999999999999!
und außerdem braucht das glaub ich ja auch eine bestimmte menge an speicherplatz!

MatthiasW 21. Aug 2003 14:37

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hallo,

Zitat:

Zitat von silent
moin mathias, danke für den code mal schauen. btw: kann ich damit mehrere erzeugen? ich meine "myForm" darf doch nur 1mal existieren oder?

du könntest das ganze doch in ein Array stecken, also

Code:
var myForm: Array[0..10] of TForm;
Mfg Matthias

Spezi1980 21. Aug 2003 15:53

Re: Unendliche Formen erzeugen (wenn nötig)
 
Nimm doch einfach einen dynamischen array, dann beschränkt nur noch der vorhandene Speicherplatz die Anzahl der Fenster die du öffnen möchtest.

Pseudemys Nelsoni 21. Aug 2003 16:09

Re: Unendliche Formen erzeugen (wenn nötig)
 
hallo, irgendwie funzt das:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var myForm: Array[1..10] of TForm;
begin
  myForm := TForm.CreateNew(Application);
  myForm.Width := 200;
  myForm.Width := 200;
  myForm.Show;
end;
aber nicht :(

rayman 21. Aug 2003 16:18

Re: Unendliche Formen erzeugen (wenn nötig)
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var myForm: Array[1..10] of TForm;
    n: integer;
begin
for n:=0 to 10 do begin
  myForm[n] := TForm.CreateNew(Application);
  myForm[n].Width := 200;
  myForm[n].Height := 100;
  myForm[n].Show;
  end;
end;
!

Pseudemys Nelsoni 21. Aug 2003 16:22

Re: Unendliche Formen erzeugen (wenn nötig)
 
hallo rayman, ich bekomme eine zugriffsverletzung bei ausführung des codes. Wenn ich den genau betrachte werden sofort 10 neue forms geöffnet, oder seh ich das falsch? :coder:

rayman 21. Aug 2003 16:30

Re: Unendliche Formen erzeugen (wenn nötig)
 
Ja

Ich hab eigentlich nur eine Schleife drum gemacht, damit alle Formuare erzeugt werden. Du kannst es ja so machen, wenn bei jedem Buttonclick nur ein Fenster geöffnet werden soll:
Delphi-Quellcode:
var Form1: TForm1;
    myForms: array of TForm; // das Feld wird global deklariert ...

procedure TForm1.FormCreate(Sender: TObject);
var n:integer;
begin
for n:=0 to 10 do begin
  myForm[n]:=TForm.Create;  // Bei Create mit Form gefüllt ...
  .....
  ...
  ..
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n:integer;
                             // und bei jedem Click kommt ein neues  
                             // Fenster dazu
begin
n:=0;
while n>=0 do if not myForm[n].Visible then begin
  myForm[n].Show;
  myForm[n].Top:=...
  ...
  n:=-1;
  end;
end;

Pseudemys Nelsoni 21. Aug 2003 16:32

Re: Unendliche Formen erzeugen (wenn nötig)
 
danke :)

johny 21. Aug 2003 23:22

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hallo Silent,
ich hoffe, du hast nichts dagegen, wenn ich deinen Thread noch ein wenig erweitere.

Diese Möglichkeit mehrere Fenster zu öffnen hat mir auch ein Stück weitergeholfen. Nur möchte ich das Fenster gerne per Drag&Drop verschieben können, wenn ich auf ein darauf angezeigtes Shape klicke. Bei einer 'normalen' Form geht das hiermit:

Delphi-Quellcode:
{ = DragAndDrop = }

var
 xPos, yPos: integer;

procedure TForm_Workspace_Canvas.Shape_BannerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 xPos := x; // x-Koordinate erfassen
 yPos := y; // y-Koordinate erfassen
end;

procedure TForm_Workspace_Canvas.Shape_BannerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if HiWord(GetAsyncKeyState(VK_LBUTTON)) > 0 then
 begin
  Form_Workspace_Canvas.Left := Form_Workspace_Canvas.Left + X - xPos; // Verschieben
  Form_Workspace_Canvas.Top := Form_Workspace_Canvas.Top + Y - yPos; // Verschieben
 end;
end;
Aber wie kann ich diese Prozeduren einbinden, wenn das Fenster erst zur Laufzeit erzeugt wird:

Delphi-Quellcode:
procedure TForm_Workspace_Main.Menu_NewClick(Sender: TObject);
var
 Form_Workspace_Canvas : TForm;
 Shape_Banner : TShape;

begin

 // Form erzeugen
 Form_Workspace_Canvas := TForm.CreateNew(Application);
 Form_Workspace_Canvas.Left := 205;
 Form_Workspace_Canvas.Top := 35;
 Form_Workspace_Canvas.Height := 725;
 Form_Workspace_Canvas.Width := 815;
 Form_Workspace_Canvas.BorderStyle := bsNone;
 Form_Workspace_Canvas.Show;

 // Shape auf der Form erzeugen
 Shape_Banner := TShape.Create(Form_Workspace_Canvas);
 with Shape_Banner do
 begin
  Parent := Form_Workspace_Canvas;
  Left := 0;
  Top := 0;
  Width:= 807;
  Height:= 9;
  Brush.Color := clGray;
  Brush.Style := bsSolid;
  Name := 'Shape_Banner';
 end;

end;

Aya 21. Aug 2003 23:33

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hi,

@Johny:
Delphi-Quellcode:
{ = DragAndDrop = } 

var
xPos, yPos: integer;

procedure TForm_Workspace_Canvas.Shape_BannerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
xPos := x; // x-Koordinate erfassen
yPos := y; // y-Koordinate erfassen
end;

procedure TForm_Workspace_Canvas.Shape_BannerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if HiWord(GetAsyncKeyState(VK_LBUTTON)) > 0 then
begin
  Form_Workspace_Canvas.Left := Form_Workspace_Canvas.Left + X - xPos; // Verschieben
  Form_Workspace_Canvas.Top := Form_Workspace_Canvas.Top + Y - yPos; // Verschieben
end;
end;

procedure TForm_Workspace_Main.Menu_NewClick(Sender: TObject);
var
Form_Workspace_Canvas : TForm;
Shape_Banner : TShape;

begin

// Form erzeugen
Form_Workspace_Canvas := TForm.CreateNew(Application);
Form_Workspace_Canvas.Left := 205;
Form_Workspace_Canvas.Top := 35;
Form_Workspace_Canvas.Height := 725;
Form_Workspace_Canvas.Width := 815;
Form_Workspace_Canvas.BorderStyle := bsNone;
Form_Workspace_Canvas.Show;

// Shape auf der Form erzeugen
Shape_Banner := TShape.Create(Form_Workspace_Canvas);
with Shape_Banner do
begin
  Parent := Form_Workspace_Canvas;
  Left := 0;
  Top := 0;
  Width:= 807;
  Height:= 9;
  Brush.Color := clGray;
  Brush.Style := bsSolid;
  Name := 'Shape_Banner';
  OnMouseDown:=Shape_BannerMouseDown; //Neu
  OnMouseMove:=Shape_BannerMouseMove; //Neu
end;

end;
Habe einfach deinen Code zusammenkopiert und 2 Zeilen eingefügt.. falls da also noch andere fehler sind, ich bin unschuldig ;)

@Silent:
Ich würde das ganze in etwa so lösen:

Delphi-Quellcode:
var //Global!
  MyForms: Array of TForm;

procedure AddNewForm(Caption: String);
begin
  SetLength(MyForms,Length(MyForms)+1);
  MyForms[High(MyForms)]:=TForm.Create(self);
  MyForms[High(MyForms)].Parent:=self;
  MyForms[High(MyForms)].Width:=150;
  MyForms[High(MyForms)].Height:=150;
  MyForms[High(MyForms)].Caption:=Caption;
end;
Au'revoir,
Aya~

johny 22. Aug 2003 00:49

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hallo Aya,

ich habe deinen Vorschlag ausprobiert, nur leider wurde das falsche Fenster verschoben. Deshalb habe ich zur Fehlersuche noch mal ein neues Projekt erstellt dessen MainForm nur einen Button hat, der ein neues Fenster erzeugt, dass dann verschoben werden soll.
Das führt aber leider zu einem Fehler. Einen möglichen Grund hat Christian Seehase in einem anderen Beitrag bereits genannt.

Incompatible types: 'method pointer and regular procedure'

Zitat:

Zitat von Christian Seehase
an der von Dir genannten Stelle erwartet der Compiler eine Methode.
Da Du aber eine Prozedure übergibts...

Dennoch vielen Dank, jetzt bin ich wieder ein wenig weiter gekommen. Da mir aber so allmählich die Augen zufallen *gähn* werde ich die Fehlersuche wohl etwas verschieben ...

Hier noch einmal der aktuelle Quellcode - sollte es jemanden interessieren ;)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm_Workspace_Canvas = class(TForm)
    Button_New: TButton;
    procedure Button_NewClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_Workspace_Canvas: TForm_Workspace_Canvas;

implementation

{$R *.dfm}

var
 xPos, yPos: integer;

procedure Shape_BannerMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 xPos := x;
 yPos := y;
 Form_Workspace_Canvas.AlphaBlendValue := 100;
 Form_Workspace_Canvas.AlphaBlend := True;
end;

procedure Shape_BannerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if HiWord(GetAsyncKeyState(VK_LBUTTON)) > 0 then
 begin
  Form_Workspace_Canvas.Left := Form_Workspace_Canvas.Left + X - xPos;
  Form_Workspace_Canvas.Top := Form_Workspace_Canvas.Top + Y - yPos;
 end;
end;

procedure Shape_BannerMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Form_Workspace_Canvas.AlphaBlendValue := 255;
 Form_Workspace_Canvas.AlphaBlend := False;
end;

procedure TForm_Workspace_Canvas.Button_NewClick(Sender: TObject);
var
 Form_Workspace_Canvas : TForm;
 Shape_Banner : TShape;
 Shape_Body : TShape;

begin

 Form_Workspace_Canvas := TForm.CreateNew(Application);
 Form_Workspace_Canvas.Left := 205;
 Form_Workspace_Canvas.Top := 35;
 Form_Workspace_Canvas.Height := 725;
 Form_Workspace_Canvas.Width := 815;
 Form_Workspace_Canvas.BorderStyle := bsNone;
 Form_Workspace_Canvas.Show;

 Shape_Banner := TShape.Create(Form_Workspace_Canvas);
 Shape_Body := TShape.Create(Form_Workspace_Canvas);

 with Shape_Banner do
 begin
  Parent := Form_Workspace_Canvas;
  Left := 0;
  Top := 0;
  Width:= 807;
  Height:= 9;
  Brush.Color := clGray;
  Brush.Style := bsSolid;
  Name := 'Shape_Banner';
  OnMouseDown := Shape_BannerMouseDown; // => Fehler!
  OnMouseMove := Shape_BannerMouseMove; // => Fehler!
  OnMouseUp := Shape_BannerMouseUp; // => Fehler!
 end;

 with Shape_Body do
 begin
  Parent := Form_Workspace_Canvas;
  Left := 0;
  Top := 8;
  Width:= 807;
  Height:=690;
  Brush.Color := clWhite;
  Brush.Style := bsSolid;
  Name := 'Shape_Body';
 end;

end;

end.

Aya 22. Aug 2003 02:16

Re: Unendliche Formen erzeugen (wenn nötig)
 
Hi,

du hast "meinen" Code falsch kopiert... ;)
du mußt Shape_BannerMouseMove (etc.) zu einer Procedure von Form1 machen, also bei Form1 im z.B. Private bereich deklarieren.

Au'revoir,
Aya~

johny 22. Aug 2003 09:34

Re: Unendliche Formen erzeugen (wenn nötig)
 
Zitat:

Zitat von Aya
Hi,

du hast "meinen" Code falsch kopiert... ;)
du mußt Shape_BannerMouseMove (etc.) zu einer Procedure von Form1 machen, also bei Form1 im z.B. Private bereich deklarieren.

Au'revoir,
Aya~

Oh ja, da hatte ich beim ausprobieren ein wenig gelöscht und das ein oder andere verändert.
Wenn ich die Ereignisse aber zu einer Prozedur von Form1 mache, wird beim Klick auf den Banner der 2. Form die Erste verschoben - nicht aber die zweite.

---

Delphi-Quellcode:
var //Global!
  MyForms: Array of TForm;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(MyForms,Length(MyForms)+1);
  MyForms[High(MyForms)]:=TForm.Create(self);
  MyForms[High(MyForms)].Parent:=self;
  MyForms[High(MyForms)].Width:=150;
  MyForms[High(MyForms)].Height:=150;
  MyForms[High(MyForms)].Caption:=Caption;
  MyForms[High(MyForms)].Show;
end;
Also wenn ich die zweite Form so erzeuge, ist sie nur innerhalb der Ersten verschiebbar.
Bei meinem Programm sollten die Formen aber ähnlich der Delphi-Oberfläche angeordnet sein - eine Menüleiste, eine Werkzeugleiste und eine Arbeitsfläche.

Mit dem Programm habe ich mich wohl doch ein wenig übernommen. Ich mache besser erst einmal mit einfacheren Sachen weiter, bevor ich wieder darauf zurückkomme.

Dennoch vielen Dank für deine Mühe, das ein oder andere habe ich auch hier wieder dazugelernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:39 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