Форум: "Прочее";
Текущий архив: 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.004 c