![]() |
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 |
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. |
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:
Jetzt drück mal die Linke Maustaste auf dem Button, und Beweg' die Maus.
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; Vielleicht kannst Du ja was damit anfangen. |
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 |
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? |
Re: Wie bastelt man einen einfachen Formular-Editor?
Zitat:
Bei mir führt er sie nicht aus! |
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; |
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 |
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.. |
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:
so kannst du dann speichern und laden:{ -- 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.
Delphi-Quellcode:
ich hoffe das hilt dir deinen form-designer zu wuppen :wink:
SaveCompoToFile(YourDynForm,'c:\'+YourDynForm.name+'.dfm'); // zB.
//... LoadCompoFromFile(YourDynForm,'c:\'+YourDynForm.name+'.dfm'); // zB. cu, maximov. PS: Beim laden werden alle plazierten compos automatisch instanziert! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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 by Thomas Breitkreuz