Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.19;
Скачать: CL | DM;

Вниз

Идея такая. Пусть пользователь сам себе рисует форму..   Найти похожие ветки 

 
12 ©   (2010-06-21 11:36) [0]

Совсем надоело перерисовывать формы...
Просто идейка Делаем класс
===========
unit uStoreRestore;
interface
uses Controls, Classes, Forms, StdCtrls, SysUtils;

type
 tStoryRestore = class
   FMode:boolean;
   b:boolean;
   FForm:tForm;
   FMemo:tStringList;
 private
   Name, Left, Top : string;
   FOnMouseDown: array of TMouseEvent;
   FOnMouseMove: array of TMouseMoveEvent;
   FOnMouseUp: array of TMouseEvent;
   FOnClik : array of TNotifyEvent;
   procedure MouseDown2(Sender: TObject; Button: TMouseButton;
                       Shift: TShiftState; X, Y: Integer);
   procedure MouseUp2(Sender: TObject; Button: TMouseButton;
                       Shift: TShiftState; X, Y: Integer);
   procedure MouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
   procedure Click2(Sender: TObject);

   function GetMode: boolean;
   procedure SetMode(const Value: boolean);
 Public
   Constructor Create(var AF:tForm); virtual;
   Destructor Destroy;  override;
   property Mode:boolean read GetMode write SetMode;
end;

implementation

{ tStoryRestore }

procedure tStoryRestore.MouseDown2(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 b := true;
end;

procedure tStoryRestore.MouseMove2(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if b then
 begin
   TControl(sender).Left := Tcontrol(sender).Left + X;
   Tcontrol(sender).Top := Tcontrol(sender).Top + Y;
end;
end;

procedure tStoryRestore.MouseUp2(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 b := false;
end;

function tStoryRestore.GetMode: boolean;
begin
 Result := FMode;
end;

procedure tStoryRestore.SetMode(const Value: boolean);
var
 i,j :integer;
begin
 if FMode = Value then Exit;
 if (Value and not(FMode)) then
 begin
   SetLength(FOnMouseUp,0);
   SetLength(FOnMouseDown,0);
   SetLength(FOnMouseMove,0);
   SetLength(FOnClik,0);
   with FForm do
   for i := 0 to ComponentCount -1 do
   begin
     if (Components[i] is TComponent) then
     begin
        if (TComponent(Components[i]).Tag <> 0) then
        begin
          setlength(FOnMouseUp, length(FOnMouseUp)+1);
          FOnMouseUp[length(FOnMouseUp)-1] := tEdit(Components[i]).OnMouseUp;
          tEdit(Components[i]).OnMouseUp := MouseUp2;

          setlength(FOnMouseDown, length(FOnMouseDown)+1);
          FOnMouseDown[length(FOnMouseDown)-1] := tEdit(Components[i]).OnMouseDown;
          tEdit(Components[i]).OnMouseDown := MouseDown2;

          setlength(FOnMouseMove, length(FOnMouseMove)+1);
          FOnMouseMove[length(FOnMouseMove)-1] := tEdit(Components[i]).OnMouseMove;
          tEdit(Components[i]).OnMouseMove := MouseMove2;

          setlength(FOnClik, length(FOnClik)+1);
          FOnClik[length(FOnClik)-1] := tEdit(Components[i]).onClick;
          tEdit(Components[i]).OnClick := Click2;
        end; //if (TComponent(Components[i]).Tag <> 0)
     end;// if (Components[i] is TComponent)
   end; //for i := 0 to Co
 end; // if (Value and not(FMode))

 if (not(Value) and FMode) then
 begin
   j:=0;
   with FForm do
   for i := 0 to ComponentCount -1 do
   begin
     if (Components[i] is TComponent) then
     begin
        if (TComponent(Components[i]).Tag <> 0) then
        begin
          tEdit(Components[i]).OnMouseUp := FOnMouseUp[j];
          tEdit(Components[i]).OnMouseDown := FOnMouseDown[j];
          tEdit(Components[i]).OnMouseMove := FOnMouseMove[j];
          tEdit(Components[i]).OnClick := FOnClik[j];
          inc(j);
        end;
     end;
   end;
 end;

 FMode := Value;
end;

constructor tStoryRestore.Create(var AF: tForm);
var
 i,j :integer;
 AC : tControl;
begin
 FForm := AF;
 j:=0;
 FMemo := tStringList.Create;

 if not(fileExists(application.ExeName + ".ctl")) then Exit;
 FMemo.LoadFromFile(application.ExeName + ".ctl");
 for i := 0 to FForm.ComponentCount -1 do
 begin
   if (FForm.Components[i] is TComponent) then
   begin
      if (TComponent(FForm.Components[i]).Tag <> 0) then
      begin
        if j >= FMemo.Count then continue;
        Name := FMemo.Strings[j];
        inc(j);
        AC := tControl(FForm.FindComponent(Name));
        if AC = nil then
        begin
          inc(j); inc(j);
        end else
        begin
          Left:=FMemo.Strings[j];
          inc(j);
          Top := FMemo.Strings[j];
          inc(j);
          AC.Left:=StrToInt(Left);
          AC.Top:=StrToInt(Top);
        end;

      end;
   end;
 end; //for i := 0 to Co
 //deletefile(application.ExeName + ".ctl");
 FMode := false;
end;

destructor tStoryRestore.Destroy;
var
 i :integer;
begin
 FMemo.Clear;
 for i := 0 to FForm.ComponentCount -1 do
 begin
   if (FForm.Components[i] is TComponent) then
   begin
      if (TComponent(FForm.Components[i]).Tag <> 0) then
      begin
        FMemo.Add( tControl(FForm.Components[i]).Name );
        FMemo.Add( IntToStr(tControl(FForm.Components[i]).Left) );
        FMemo.Add( IntToStr(tControl(FForm.Components[i]).Top)  );
      end;
   end;
 end; //for i := 0 to Co
 FMemo.SaveToFile(application.ExeName + ".ctl");

 FreeAndNil(FMemo);
 SetLength(FOnMouseUp,0);
 SetLength(FOnMouseDown,0);
 SetLength(FOnMouseMove,0);
 SetLength(FOnClik,0);
 inherited;
end;

procedure tStoryRestore.Click2(Sender: TObject);
begin
 ;
end;

end.
====
uses
 uStoreRestore;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Label1: TLabel;
   Button2: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private     { Private declarations }
   SR : tStoryRestore;
 public      { Public declarations }
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const MySecretTag: integer = 1;
begin
 Button1.Tag := MySecretTag;
 Memo1.Tag := MySecretTag;
 Label1.Tag := MySecretTag;
 Button2.Caption := "   таскать";
 SR := tStoryRestore.Create(TForm(Form1));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 SR.Mode := not(SR.Mode);
 case SR.Mode of
   true: Button2.Caption := "Не таскать";
  false: Button2.Caption := "   таскать";
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeAndNil(SR);
end;


 
oldman ©   (2010-06-21 11:39) [1]

"Ты ж программист, ты должен сам все знать и сделать, а я в этом ничего не понимаю. Да и времени у меня нет." (Пользователь ©)


 
Ega23 ©   (2010-06-21 11:40) [2]

"План - говно, я в нём участвовать отказываюсь, я - брезгую!"
(с) Охлобыстин в роли "Быкова", сериал "Интерны".


 
12 ©   (2010-06-21 11:41) [3]

примерно так, нажал кнопку, у всех компонет события на мышь забрали, на мышь теперь только движение, подвигали, (можно и размер поменяли), потом нажали на кнопку, все мышиные события вернулись.
при запуске и выходе считали/сохранили в файл.

Но чувствую, что велосипед..


 
tesseract ©   (2010-06-21 11:47) [4]


> Но чувствую, что велосипед..


Не зря чуствуешь. Можно ещё поприкалыватся и добавить перевести VCL в DesignState. Правда чую, что это чревато Av.


 
Думкин ©   (2010-06-21 11:48) [5]

> 12 ©   (21.06.10 11:41) [3]

Книга есть. Еще под Д3 писалась. Куча авторов. Не помню название, дома гляну, если надо. Там описывалось как давать пользователю возможности динамической смены интерфейса - в пределах, понятно.


 
turbouser ©   (2010-06-21 12:03) [6]


> 12 ©   (21.06.10 11:41) [3]

http://devexpress.com/Products/VCL/ExLayoutControl/


 
KilkennyCat ©   (2010-06-21 12:16) [7]

виндоуз так и сделали


 
Юрий Зотов ©   (2010-06-21 20:25) [8]

> Пусть пользователь сам себе рисует форму..
> Но чувствую, что велосипед..

Скриншоты и их описание: http://www.fayloobmennik.net/56792

Сделано 10 лет назад. Юзер сам себе и форму делает (аналог Delphi IDE), и код пишет (на подмножестве Object Pascal).


 
Медвежонок Пятачок ©   (2010-06-21 22:08) [9]

> Пусть пользователь сам себе рисует форму..

и заодно код к ней



Страницы: 1 вся ветка

Текущий архив: 2010.09.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1277317567
lihoy_p5
2010-06-23 22:26
2010.09.19
загрузка следующего изображения


15-1277152197
Юрий
2010-06-22 00:29
2010.09.19
С днем рождения ! 22 июня 2010 вторник


2-1277558905
HF-Trade
2010-06-26 17:28
2010.09.19
Блокировать доступ к памяти процесса


15-1276851347
Kerk
2010-06-18 12:55
2010.09.19
Кто-нибудь сталкивался с nosql-базами?


10-1168111829
nali
2007-01-06 22:30
2010.09.19
Ошибка при вызове com сервера...