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 Wie bastelt man einen einfachen Formular-Editor? (https://www.delphipraxis.net/11063-wie-bastelt-man-einen-einfachen-formular-editor.html)

Wormid 30. Okt 2003 14:08


Wie bastelt man einen einfachen Formular-Editor?
 
Hello Leute,

ist es mit einem vertretbarem Aufwand möglich, einen kleinen Formular-Editor für den Anwender zu erstellen?
Er soll bei weitem nicht den Funktionsumfang einer echten IDE haben, aber ich möchte "dem User" die Möglichkeit geben, die Größe der Form (das ist einfach) festzulegen und ihn dann beliebig Buttons und Labels darauf platzieren lassen. Dabei sollen die Buttons z.B. so ähnlich wie in der Delphi-IDE verschieb- und resizebar sein. Die weiteren Eigenschaften liessen sich ja dann über Dialoge (Aufruf via Kontextmenü) bearbeiten.

Hat jemand nee Idee, oder nen Ansatzpunkt (oder nen Link für ne Lektüre) für sowas?

Gruß

Wormid

Treffnix 30. Okt 2003 14:31

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Machbar wäre das.

Zum Verschieben könntest du OnMouseDown ein Flag setzen, dass nu verschoben werden soll. und dann on Mousemove Left und Top des Elements in Relation zur Mausbewegung ändern und OnMouseup das Flag wieder wegnehmen. Beim Resize ähnlich, nur müsstest du hier die genaue Position des Mousedown abfragen, weil das ja nur am äusseren Rand passieren soll.

Christian Seehase 30. Okt 2003 17:22

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Moin Wormid,

nimm mal ein Formular, leg einen Button drauf und dann kommen in MouseDown, bzw. MouseUp des Button folgende Zeilen:

Delphi-Quellcode:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Button1.Handle,WM_SYSCOMMAND,$F012,0);
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetCapture(self.Handle);
end;
Jetzt drück mal die Linke Maustaste auf dem Button, und Beweg' die Maus.

Vielleicht kannst Du ja was damit anfangen.

Wormid 30. Okt 2003 17:30

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Das ist schonmal ziemlich gut! :thuimb:

Da werde ich mich dann mal ein bisschen ausführlicher mit auseinandersetzten.


Gruß

Wormid

Wormid 30. Okt 2003 17:45

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Oder ist es insgesamt vielleicht einfacher, das ganze z.B. per DrawFrameControl direkt auf das Canvas der Form zu zeichen? Also gar nicht erst Controls erstellen, sondern einfach nur Zeichnen.
Wäre das vielleicht einfacher?

citybreaker 30. Okt 2003 18:45

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Zitat:

Zitat von Christian Seehase
Moin Wormid,

nimm mal ein Formular, leg einen Button drauf und dann kommen in MouseDown, bzw. MouseUp des Button folgende Zeilen:

Delphi-Quellcode:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Button1.Handle,WM_SYSCOMMAND,$F012,0);
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SetCapture(self.Handle);
end;
Jetzt drück mal die Linke Maustaste auf dem Button, und Beweg' die Maus.

Vielleicht kannst Du ja was damit anfangen.

Was ist wenn man jetzt dem Button eine OnClick procedure verpassen will?
Bei mir führt er sie nicht aus!

Christian Seehase 30. Okt 2003 19:11

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Moin Citybreaker,

das war nur eine Idee.
Ob die für jetzt wirklich für einen Formular-Editor geeignet ist, hab' ich nicht weiter getestet.

Workaround: [CTRL]+Linke Maustaste = Designmode

Delphi-Quellcode:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not (ssCtrl in Shift) then exit;
  ReleaseCapture;
  SendMessage(Button1.Handle,WM_SYSCOMMAND,$f012,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('CLICK');
end;

Wormid 31. Okt 2003 10:34

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moinsen,

ich habe dann mal aus Christians vorschlag ein "Projekt1" erstellt... Das erstellen und verschieben der Buttons funzt nun wunderbar - hat jetzt noch jemand ne Idee, wie ich das mit dem Resizen der Buttons hinbekommen kann?

Gruß

Wormid

Nalincah 31. Okt 2003 10:36

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Probiers mal mit den DSNSys-Komponenten..
Da ist auch ein ObjectInspector dabei..Und auskennen tu ich mich damit auch etwas. Könntest also auch bei Problemen Fragen..

maximov 31. Okt 2003 10:54

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Ich kann zwar jetzt nicht viel zu deinem edit prob sagen...nur dass du vielleicht die property 'ComponentState' missbrauchen könntest und auf 'scDesigning' setzen, dann hasst du schonmal ein flag, bzw. werden sie vielleicht auch anders gezeichnet etc.

Aber du musst die formulare ja auch speichern...da hätt ich vielleicht einen kleinen leckerbissen für dich, mit dem du deine forms als dfm-text (oder binary) speichern und laden kannst:

Delphi-Quellcode:

{ -- Author: max hub (aka maximov alias maximus) - 2003 --}

unit dmService;

interface

uses classes, sysUtils, TypInfo;


function SaveCompoToFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;
function LoadCompoFromFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;


implementation



function SaveCompoToFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;
var Stream1:TMemoryStream;
    Stream2:TMemoryStream;
      format : TStreamOriginalFormat;
begin
  result := false;
  format := sofText;
  Stream1 := TMemoryStream.Create;
  Stream2 := TMemoryStream.Create;
  try
    Stream1.WriteComponent(aCompo);
    Stream1.Position := 0;
    if not asBinary then
    begin
      format := sofText;
      ObjectBinaryToText(Stream1,Stream2,format);
    end else Stream1.SaveToStream(Stream2);
    Stream2.SaveToFile(FileName);
    result := true;
  finally
    Stream1.Free;
    Stream2.Free;
  end;
end;


function LoadCompoFromFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;
var FileStream:TFileStream;
    MemoryStream:TMemoryStream;
    format:TStreamOriginalFormat;
begin
  result := false;
  if not FileExists(fileName) then exit;
  MemoryStream := TMemoryStream.Create;
  FileStream := TFileStream.Create(FileName,fmOpenRead);
  try
    if not asBinary then
    begin
      format := sofBinary;
      ObjectTextToBinary(FileStream,MemoryStream,format);
    end else MemoryStream.LoadFromStream(FileStream);
    MemoryStream.Position := 0;  
    MemoryStream.ReadComponent(aCompo);
    result := true;
  finally
    FileStream.Free;
    MemoryStream.Free;
  end;
end;

end.
so kannst du dann speichern und laden:

Delphi-Quellcode:
SaveCompoToFile(YourDynForm,'c:\'+YourDynForm.name+'.dfm'); // zB.
//...
LoadCompoFromFile(YourDynForm,'c:\'+YourDynForm.name+'.dfm'); // zB.
ich hoffe das hilt dir deinen form-designer zu wuppen :wink:

cu,

maximov.

PS: Beim laden werden alle plazierten compos automatisch instanziert!


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