x77 Мне вот тоже стало интересно как это осуществить... думаю двигаться надо в этом направлении: Создать некое подобие Delphi DesignMode, собственно я етим и занимался целых два часа все конечно очень криове даже Alpha версией не назовешь=), но все же... может такого же типа ченить сделаешь (только поприличней ну и не за два часа)... насамом деле интересная штука. myEditor.pas
| Код | unit myEditor; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ComCtrls, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Page: TScrollBox; Button3: TButton; Button2: TButton; DataEditor: TListBox; BitBtn1: TBitBtn; Button1: TButton; procedure BitBtn1Click (Sender: TObject); procedure ImgMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure ImgMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure TxtMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure TxtMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ObjectSelect (Sender: TObject); procedure PageClick (Sender: TObject); procedure FormCreate (Sender: TObject); procedure DataEditorDblClick (Sender: TObject); procedure Button1Click (Sender: TObject); procedure Button2Click (Sender: TObject); procedure Button3Click (Sender: TObject); private procedure createImg(AName: String; ALeft, ATop :Integer; Prop:Boolean); procedure createTxt(AName, AText:String; ALeft, ATop :Integer); public published procedure SetProperty(key, value: String); procedure UpdateDataEditor; end;
var Form1: TForm1; Selected: TObject; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); begin createIMG ('Image_'+inttostr(Page.ControlCount), 150, 150, True); end; procedure TForm1.ImgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var P: TPoint; begin if ssLeft in Shift then begin GetCursorPos (P); P := Page.ScreenToClient ( Point(P.X-(Sender as TImage).UndockHeight, P.Y-(Sender as TImage).UndockWidth)); (Sender as TImage).Left := P.X; (Sender as TImage).Top := P.Y; end; end;
procedure TForm1.ImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TImage).UndockHeight := X; (Sender as TImage).UndockWidth := Y; end;
procedure TForm1.TxtMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var P: TPoint; begin if ssLeft in Shift then begin GetCursorPos (P); P := Page.ScreenToClient ( Point(P.X-(Sender as TLabel).UndockHeight, P.Y-(Sender as TLabel).UndockWidth)); (Sender as TLabel).Left := P.X; (Sender as TLabel).Top := P.Y; end; end;
procedure TForm1.TxtMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TLabel).UndockHeight:=X; (Sender as TLabel).UndockWidth:=Y; end;
procedure TForm1.ObjectSelect(Sender: TObject); begin Selected := Sender; DataEditor.Items.Clear; if Assigned (Selected) then TCustomControl(Sender).BringToFront; UpdateDataEditor; end;
procedure TForm1.PageClick(Sender: TObject); begin ObjectSelect (nil); end;
procedure TForm1.FormCreate(Sender: TObject); begin DataEditor.Items.NameValueSeparator := ':'; end;
procedure TForm1.DataEditorDblClick(Sender: TObject); var key, newP, P:String; begin P := DataEditor.Items.ValueFromIndex [DataEditor.ItemIndex]; key := DataEditor.Items.Names[DataEditor.ItemIndex]; newP := P; InputQuery('Изменение параметров','Введите новое значение',newP); if P <> newP then SetProperty (key,newP); end;
procedure TForm1.SetProperty(key, value: String); begin if Selected.ClassName='TImage' then begin if key = 'Name ' then (Selected as TImage).Name := value; if key = 'Top ' then (Selected as TImage).Top := strtoint(value); if key = 'Left ' then (Selected as TImage).Left := strtoint(value); if key = 'Proportional ' then (Selected as TImage).Proportional := (UpperCase(value)='TRUE'); end; if Selected.ClassName='TLabel' then begin if key = 'Name ' then (Selected as TLabel).Name := value; if key = 'Top ' then (Selected as TLabel).Top := strtoint(value); if key = 'Left ' then (Selected as TLabel).Left := strtoint(value); if key = 'Text ' then (Selected as TLabel).Caption := value; end; UpdateDataEditor; end;
procedure TForm1.UpdateDataEditor; begin if Not Assigned (Selected) then exit; if Selected.ClassName = 'TImage' then begin DataEditor.Items.Values['Name '] := (Selected as TImage).Name; DataEditor.Items.Values['Top '] := inttostr((Selected as TImage).Top); DataEditor.Items.Values['Left '] := inttostr((Selected as TImage).Left); if (Selected as TImage).Proportional then DataEditor.Items.Values['Proportional '] := 'True' else DataEditor.Items.Values['Proportional ']:='False'; end;
if Selected.ClassName='TLabel' then begin DataEditor.Items.Values['Name '] := (Selected as TLabel).Name; DataEditor.Items.Values['Top '] := inttostr((Selected as TLabel).Top); DataEditor.Items.Values['Left '] := inttostr((Selected as TLabel).Left); DataEditor.Items.Values['Text '] := (Selected as TLabel).Caption; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin createTxt ('Component_'+inttostr(Page.ControlCount), 'Мой текст', 10, 10); end;
procedure TForm1.Button2Click(Sender: TObject); var x: Integer; F: TextFile; begin AssignFile (F, 'myfile.myFORMAT'); ReWrite (F); for x := 0 to Page.ControlCount-1 do begin if Page.Controls[x].ClassName = 'TImage' then begin Writeln(F, 'IMAGE'); Writeln(F, (Page.Controls[x] as TImage).Name); Writeln(F, (Page.Controls[x] as TImage).Left); Writeln(F, (Page.Controls[x] as TImage).Top); Writeln(F, Byte((Page.Controls[x] as TImage).Proportional)); end; if Page.Controls[x].ClassName = 'TLabel' then begin Writeln(F, 'TEXT'); Writeln(F, (Page.Controls[x] as TLabel).Name); Writeln(F, (Page.Controls[x] as TLabel).caption); Writeln(F, (Page.Controls[x] as TLabel).Left); Writeln(F, (Page.Controls[x] as TLabel).Top); end; end; CloseFile(F); end;
procedure TForm1.createImg(AName: String; ALeft, ATop: Integer; Prop: Boolean); var I: TIMage; dr: PChar; begin I := TImage.Create (Page); GetMem (dr, 144); GetWindowsDirectory (dr, 144); I.Picture.LoadFromFile (String(dr) + '\Пузыри.bmp'); FreeMem (dr); I.Parent := Page; I.Top := ATop; I.Left := ALeft; I.Proportional := Prop; I.Name := AName; I.OnMouseMove := ImgMouseMove; I.OnMouseDown := ImgMouseDown; I.OnClick := objectSelect; end;
procedure TForm1.createTxt(AName, AText: String; ALeft, ATop: Integer); var I: TLabel; begin I := TLabel.Create (Page); I.Parent := Page; I.Name := AName; I.Caption := AText; I.Top := ATop; I.Left := ALeft; I.OnMouseMove := TxtMouseMove; I.OnMouseDown := TxtMouseDown; I.OnClick := objectSelect; end;
procedure TForm1.Button3Click(Sender: TObject); var F: TextFile; p1,p2,p3,p4,s: String; begin AssignFile (F,'myfile.myFORMAT'); Reset (F); while not eof(F) do begin ReadLn (F,s); ReadLn (F,p1); ReadLn (F,p2); ReadLn (F,p3); ReadLn (F,p4); if S='IMAGE' then createImg (p1, strtoint(p2), strtoint(p3), (p4 = '1')); if S='TEXT' then createTxt (p1, p2, strtoint(p3), strtoint (p4)); end; CloseFile(F); end;
end. |
myEditor.dfm
| Код | object Form1: TForm1 Left = 174 Top = 166 BorderStyle = bsDialog Caption = 'Form1' ClientHeight = 271 ClientWidth = 564 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] FormStyle = fsNormal KeyPreview = True OldCreateOrder = False Position = poScreenCenter Visible = True OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Page: TScrollBox Left = 160 Top = 0 Width = 404 Height = 271 Align = alRight TabOrder = 0 OnClick = PageClick end object Button3: TButton Left = 78 Top = 242 Width = 75 Height = 25 Caption = 'Загрузить' TabOrder = 1 OnClick = Button3Click end object Button2: TButton Left = 2 Top = 242 Width = 75 Height = 25 Caption = 'Сохранить' TabOrder = 2 OnClick = Button2Click end object DataEditor: TListBox Left = 4 Top = 28 Width = 149 Height = 213 BevelKind = bkFlat BorderStyle = bsNone ItemHeight = 13 TabOrder = 3 OnDblClick = DataEditorDblClick end object BitBtn1: TBitBtn Left = 2 Top = 2 Width = 75 Height = 25 Caption = 'Картинка' TabOrder = 4 OnClick = BitBtn1Click end object Button1: TButton Left = 80 Top = 2 Width = 75 Height = 25 Caption = 'Текст' TabOrder = 5 OnClick = Button1Click end end
| |