Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
2-1277283818
12
2010-06-23 13:03
2010.09.19
Научите работать, как работает ShowMessageFmt


15-1276979398
Юрий
2010-06-20 00:29
2010.09.19
С днем рождения ! 20 июня 2010 воскресенье


2-1277531501
mm0
2010-06-26 09:51
2010.09.19
(Win7)Сообщение о подтв. запуска


15-1276892998
Юрий
2010-06-19 00:29
2010.09.19
С днем рождения ! 19 июня 2010 суббота


15-1276780683
shaman
2010-06-17 17:18
2010.09.19
объектно-ориентированное програмирование





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский