Delphi-PRAXiS

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!

Wormid 31. Okt 2003 12:00

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Thx, zum einen werde ich mir die genannten Kompos mal ansehen, und die Proceduren fürs speichern könnten mir auch noch nützlich sein! :thuimb:

stoxx 16. Feb 2009 15:50

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

PS: Beim laden werden alle plazierten compos automatisch instanziert!
Kann man das verhindern? wenn man also einfach ein bestehendes Form kurz verändern möchte?

sirius 16. Feb 2009 17:29

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

Zitat von stoxx
Zitat:

PS: Beim laden werden alle plazierten compos automatisch instanziert!
Kann man das verhindern? wenn man also einfach ein bestehendes Form kurz verändern möchte?

CreateNew

stoxx 17. Feb 2009 00:00

Re: Wie bastelt man einen einfachen Formular-Editor?
 
ich wollte ja gerade kein neues formular createn, weil wenn man nur die gespeicherten Einstellungen übernehmen möchte, kommt dann, eine Fehlermeldung, dass es die betreffende Stringgrid auf dem Formular schon gäbe ...

bei
MemoryStream.ReadComponent(aComponent);

sirius 17. Feb 2009 09:10

Re: Wie bastelt man einen einfachen Formular-Editor?
 
sorry, ich habs genau andersrum verstanden.

Jakob Ullmann 17. Feb 2009 09:47

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Also wenn du nicht gerade Fremdkomponenten nehmen willst, wirst du wohl ums Selbst-Zeichnen nicht herum kommen (zumindest im Design-Mode). Die Idee mit dem ReleaseCapture ist meiner Meinung nach nicht dafür zu gebrauchen, da dann ja sofort verschoben wird.

PS: ReleaseCapture könnte man vielleicht doch gebrauchen, zumindest beim Größe ändern, zum Beispiel mit vier Shapes. :mrgreen:

olee 17. Feb 2009 10:23

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Also ich denke die Editfunktionen werden wohl schon in Delphi drin sein.

Vllt. reicht es ja csDesigning zu setzten und dann lassen die sich ja vllt.
schon von selbst ziehen die Objekte.

Ansonsten würde ich dir raten alle Mausereignisse ans Formular liefern zu lassen
und über Sender die Objekte verschieben zu lassen.

MFG

Hawkeye219 17. Feb 2009 12:49

Re: Wie bastelt man einen einfachen Formular-Editor?
 
Hallo stoxx,

mit der ExtLib erhältst du Objektinspektor und Designer, mit denen du vielleicht eine einfache IDE aufbauen kannst. Eventuell ist auch dieser Thread für dich interessant.

Gruß Hawkeye

stoxx 17. Feb 2009 12:54

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

Zitat von Hawkeye219
Hallo stoxx,

mit der ExtLib erhältst du Objektinspektor und Designer, mit denen du vielleicht eine einfache IDE aufbauen kannst. Eventuell ist auch dieser Thread für dich interessant.

Gruß Hawkeye

hey Jungs, trotzdem Danke, aber die Originalfrage war von 2003 und ich wollte lediglich wissen, man das createn verhindern kann.
So einen Objectinspector haben wir als erstes probiert, aber da wird man ja nervös, wenn man zig einstellungen und zahlen da ändern soll, da ist man in einer Textdatei wesentlich schneller.
Es geht auch nicht um visuelle Komponenten, sondern um Parametereinstellungen...
Deswegen wollten wir ein einfaches hirarchiches Format, was die Funktionalität von XML bieten soll, aber einfacher zu editieren ist .. und da ist das DFM Format eigentlich Klasse ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.

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