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

Вниз

Как видимые компоненты на проге перемещать?   Найти похожие ветки 

 
vodvorezlaya   (2006-09-25 08:18) [0]

Всем доброго времень суток.

Как сделать чтоб во время выполнения программы компоненты(все) можно было перемещать, и их позиции сохранялись до следующего запуска?

Спасибо.


 
@!!ex ©   (2006-09-25 08:37) [1]

Перемещать мышкой?
Или програмно?


 
@!!ex ©   (2006-09-25 08:45) [2]

Вот код для сохранения/загрузки позиций компонентов.

var
Config:TStringList;
CurrentPosition:integer;
Path:string;
begin
Path:=ExtractFilePath(ParamStr(0));
Config:=TStringList.Create;
//Загрузка позиций

if FileExists(Path+"config.pos") then
begin
 CurrentPosition:=0;
 Config.LoadFromFile(Path+"config.pos");

 Component1.Left:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);
 Component1.Top:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);

 Component2.Left:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);
 Component2.Top:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);

 ...
 ComponentN.Left:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);
 ComponentN.Top:=StrToInt(Config.Strings[CurrentPosition]);
 inc(CurrentPosition);

end;

 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;

//Сохранение позиций
Config.Clear;
Config.Add(IntToStr(Component1.Left));
Config.Add(IntToStr(Component1.Top));

Config.Add(IntToStr(Component2.Left));
Config.Add(IntToStr(Component2.Top));

...

Config.Add(IntToStr(ComponentN.Left));
Config.Add(IntToStr(ComponentN.Top));
Config.SaveToFile(Path+"config.pos");
end.


Можно тоже самое реализовать без использования TStringList, но я не стал это писать, т.к. кода побольше.
ИМХО так проще всего.

P.S.
Сорри, если есть ошибки, код писал прямо здесь, а не в IDE.


 
@!!ex ©   (2006-09-25 08:46) [3]

P.P.S.
А почему топик в WinAPI форуме????


 
vodvorezlaya   (2006-09-25 08:49) [4]


> Перемещать мышкой?
> Или програмно?

Мышкой.


 
Сивый ©   (2006-09-25 08:53) [5]

Например так: на форму кидай кнопку и в обработчиках событий пиши следующее:

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 begin
   if Button=mbLeft then
     begin
       ReleaseCapture;
       SendMessage((Sender as TButton).Handle, WM_SYSCOMMAND, 61458, 0);
     end;
 end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 var FileStream: TFileStream;
 begin
   FileStream := TFileStream.Create("Formstate.dat", fmCreate);
   FileStream.WriteComponent(self);
   FileStream.Free;
 end;

procedure TForm1.FormCreate(Sender: TObject);
 var FileStream: TFileStream;
     i: integer;
 begin
   if (FileExists("Formstate.dat")) then
     begin
       for i:= 0 to ComponentCount-1 do self.Components[0].Free;
       FileStream := TFileStream.Create("Formstate.dat", fmOpenRead);
       FileStream.ReadComponent(self);
       FileStream.Free;
     end;
 end;

Тока не понятно зачем это нужно? :-)))


 
Весь в делах   (2006-09-25 08:58) [6]

Вот самый примитивный

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const
 Sc_dragmove = $F012;
begin
 ReleaseCapture;
 Button1.Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;


 
Сивый ©   (2006-09-25 09:01) [7]

Прошу прощения в обработчике FormCreate строку поправь для общего случая:

for i:= 0 to ComponentCount-1 do self.Components[i].Free

Проверял на одной кнопке :-))


 
@!!ex ©   (2006-09-25 09:03) [8]

Про сохранение уже привели примеров.
По перемещению - тоже.
Только не большое исправление:

procedure TForm1.MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
const
Sc_dragmove = $F012;
begin
ReleaseCapture;
with Sender as TWinControl do
 Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;


Всем компонентам, которые двигшать надо - ставиш в обработчик движения мыши эту функцию.


 
vodvorezlaya   (2006-09-25 09:22) [9]

Ну спасибо, откуда вы это всё знаете?

:))


 
@!!ex ©   (2006-09-25 09:26) [10]

vodvorezlaya   (25.09.06 09:22) [9]

Теперь и вы знаете. :))
Сталкиваешся с задачей, в процессе узнаеш как ее решать.

Работает все нормально?


 
Сивый ©   (2006-09-25 09:30) [11]

Единственное, что осталось без ответа: зачем это нужно и почему дискуссия идет в ветке по API?  :-)))


 
@!!ex ©   (2006-09-25 09:34) [12]

Сивый ©   (25.09.06 09:30) [11]
>> ...зачем это нужно ...

А это зачем нужнО? :))
http://delphimaster.net/view/5-1159157473/


 
Сивый ©   (2006-09-25 09:43) [13]

@!!ex ©   (25.09.06 09:34) [12]
>А это зачем нужнО? :))

Ты меня озадачил на полдня как минимум. :-))

vodvorezlaya

Это ж в каком иституте надо учиться, что бы перед тобой такие задачи ставили :-)))


 
vodvorezlaya   (2006-09-25 09:44) [14]


> Работает все нормально?

Конечно, с вами все пока работает.

> Единственное, что осталось без ответа: зачем это нужно и
> почему дискуссия идет в ветке по API?  :-)))

Ну, так получилось.


> А это зачем нужнО? :))

Перемещать научился, осталось научиться создавать.


 
Плохиш ©   (2006-09-25 11:56) [15]


> Перемещать научился, осталось научиться создавать.

О, это круто - перемещать не созданные компоненты...


 
gdaujk ©   (2006-09-26 16:05) [16]


> @!!ex ©   (25.09.06 08:45) [2]


А зачем вы строки сохраняете. Не легче заполнить динамический Integer-массив и его кинуть в файл? Потом доставать из файла одно удовольствие...без всяких там StrToInt...


 
@!!ex ©   (2006-09-26 18:37) [17]

gdaujk ©   (26.09.06 16:05) [16]
Привычка из программирования под *nix.
Все конфиги должны редактировать в текстовом редаткоре. :))
Вообще то согласен с вами. Но так нагляднее. Плюс всегда исправить можно легко.



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

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

Наверх




Память: 0.51 MB
Время: 0.049 c
1-1157127682
gear
2006-09-01 20:21
2006.10.15
Как сделать чтобы открытое PopupMenu не закрывалось при смене...


3-1156069250
Johnny_Raw
2006-08-20 14:20
2006.10.15
помогите составить sql-запрос, а то поиск медленнее чем в paradox


1-1157210797
Ragazor
2006-09-02 19:26
2006.10.15
Как передать из dll хранящиеся там frame-ы?


10-1124370623
Lotus
2005-08-18 17:10
2006.10.15
Достучаться до текста в ячейке таблицы Ворда


1-1157747131
markers
2006-09-09 00:25
2006.10.15
Значаение строк MouseWheel