![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как видимые компоненты на проге перемещать?
vodvorezlaya © (2006-09-25 08:18:00)Всем доброго времень суток.
Как сделать чтоб во время выполнения программы компоненты(все) можно было перемещать, и их позиции сохранялись до следующего запуска?
Спасибо.
@!!ex (2006-09-26 18:37:00) [1]gdaujk © (26.09.06 16:05) [16]
Привычка из программирования под *nix.
Все конфиги должны редактировать в текстовом редаткоре. :))
Вообще то согласен с вами. Но так нагляднее. Плюс всегда исправить можно легко.
gdaujk (2006-09-26 16:05:00) [2]
> @!!ex © (25.09.06 08:45) [2]
А зачем вы строки сохраняете. Не легче заполнить динамический Integer-массив и его кинуть в файл? Потом доставать из файла одно удовольствие...без всяких там StrToInt...
Плохиш (2006-09-25 11:56:00) [3]
> Перемещать научился, осталось научиться создавать.
О, это круто - перемещать не созданные компоненты...
vodvorezlaya (2006-09-25 09:44:00) [4]
> Работает все нормально?
Конечно, с вами все пока работает.
> Единственное, что осталось без ответа: зачем это нужно и
> почему дискуссия идет в ветке по API? :-)))
Ну, так получилось.
> А это зачем нужнО? :))
Перемещать научился, осталось научиться создавать.
Сивый (2006-09-25 09:43:00) [5]@!!ex © (25.09.06 09:34) [12]
>А это зачем нужнО? :))
Ты меня озадачил на полдня как минимум. :-))
vodvorezlaya
Это ж в каком иституте надо учиться, что бы перед тобой такие задачи ставили :-)))
@!!ex (2006-09-25 09:34:00) [6]Сивый © (25.09.06 09:30) [11]
>> ...зачем это нужно ...
А это зачем нужнО? :))
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1159157473&n=12
Сивый (2006-09-25 09:30:00) [7]Единственное, что осталось без ответа: зачем это нужно и почему дискуссия идет в ветке по API? :-)))
@!!ex (2006-09-25 09:26:00) [8]vodvorezlaya (25.09.06 09:22) [9]
Теперь и вы знаете. :))
Сталкиваешся с задачей, в процессе узнаеш как ее решать.
Работает все нормально?
vodvorezlaya (2006-09-25 09:22:00) [9]Ну спасибо, откуда вы это всё знаете?
:))
@!!ex (2006-09-25 09:03:00) [10]Про сохранение уже привели примеров.
По перемещению - тоже.
Только не большое исправление:
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;
Всем компонентам, которые двигшать надо - ставиш в обработчик движения мыши эту функцию.
Сивый (2006-09-25 09:01:00) [11]Прошу прощения в обработчике FormCreate строку поправь для общего случая:
for i:= 0 to ComponentCount-1 do self.Components[ i].Free
Проверял на одной кнопке :-))
Весь в делах (2006-09-25 08:58:00) [12]Вот самый примитивный
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 08:53:00) [13]Например так: на форму кидай кнопку и в обработчиках событий пиши следующее:
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;
Тока не понятно зачем это нужно? :-)))
vodvorezlaya (2006-09-25 08:49:00) [14]
> Перемещать мышкой?
> Или програмно?
Мышкой.
@!!ex (2006-09-25 08:46:00) [15]P.P.S.
А почему топик в WinAPI форуме????
@!!ex (2006-09-25 08:45:00) [16]Вот код для сохранения/загрузки позиций компонентов.
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:37:00) [17]Перемещать мышкой?
Или програмно?