![]() |
|
|
#1
|
|||
|
|||
|
Добрый день. Пожалуйста срочно нужна помощь.
Я уже создавала одну тему насчет того как сделать кнопки что бы если одна была не видима через проверку Button1.Visible := FileExists('c:/1.exe'); то другая ниже ее кнопка поднялась на ее место, мне предложили через координаты это сделать, плизз покажите пример а то что то совсем не соображу как это сделать программно??? ![]() |
|
#2
|
|||
|
|||
|
Код:
if not Button1.Visible then begin Button2.Top:=Button1.Top; Button2.Left:=Button1.Left; end; |
|
#3
|
|||
|
|||
|
Спасибо..сейчас проверю
|
|
#4
|
|||
|
|||
|
Блин так не пойдет, много кнопок, а как с помощью массива такое сделать?
|
|
#5
|
|||
|
|||
|
Собственно, тебе надо 2 вещи:
1. Создать массив ссылок на кнопки 2. Сделать процку, кторая их разместит по вертикали или горизонтали с учетом видимости. Кстати, альтернативный вариант. Делать кнопки не невидимыми, а запрещенными (св-во Enabled). Тогда не придется их двигать. А теперь к коду. Заполнение масива расчитано на то, что кнопки лежат на самой форме и являются TButton. Код:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FButtonList : TList;
procedure ReArrangeButtons(ASpace : Integer);
public
{ Public declarations }
end;
...
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
FButtonList := TList.Create;
For I := 0 To Self.ComponentCount-1 Do
If Self.Components[i] Is TButton Then
FButtonList.Add(Self.Components[i]);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FButtonList.Free;
end;
procedure TForm1.ReArrangeButtons(ASpace: Integer);
var
I : Integer;
ALeft : Integer;
begin
ALeft := ASpace; // Place of 1st button
For I := 0 To FButtonList.Count-1 Do
If TButton(FButtonList[i]).Visible Then
Begin
TButton(FButtonList[i]).Left := ALeft; // Place button
ALeft := ALeft + TButton(FButtonList[i]).Width + ASpace; // Calc left of next button
End;
end; |
|
#6
|
|||
|
|||
|
Хм. Пусть у нас есть два массива:
Код:
Positions=array of array integer; //здесь хранятся координаты Top кнопок в оригинальном положении Buttons=array of array of TButton; Пусть кнопка Buttons[i,j] не видна, тогда надо все кнопки что под ней сдвинуть вверх: Код:
for k:=i+1 to <количество строк кнопок> - 1 do begin Buttons[k,j].Top:=Positions[k-1,j]; end; Код:
for k:=i+1 to <количество строк кнопок> - 1 do begin Buttons[k,j].Top:=Positions[k,j]; end; |
|
#7
|
|||
|
|||
|
Эх что-то у меня ничего не получается(((
|
|
#8
|
|||
|
|||
|
Что и где не получается?
|
|
#9
|
|||
|
|||
|
как этот массив ссылок создать? ( простите за такую глупость)
|
|
#10
|
|||
|
|||
|
А мож просто создать динамические кнопки?
|
|
#11
|
|||
|
|||
|
Дык код мой посомтри. Он этот массив и создает во время создания формы (FormCreate).
|
|
#12
|
|||
|
|||
|
Не совсем понял суть проблемы...Если надо чтобы при разных ситуациях одна и та же кнопка выполняла разные процедуры при нажатии то просто напишите все эти процедуры и назначайте на одну кнопку их в процессе выполнения программы (Button1.OnClick := 'название процедуры')
Либо напишите одну процедуру, но сделайте в ней case или группу if. Если вам надо чтобы у вас было куча кнопок в одном месте, но одна всегда сверху (не по координатам, а по слоям) то используйте для поднятия кнопки BringToFront (Button1.BringToFront) ну или для опускания SendToBack (Button1.SendToBack). |
|
#13
|
|||
|
|||
|
Спасибо всем буду пробывать
Последний раз редактировалось Sveta22, 14.11.2008 в 11:05. |
|
#14
|
||||
|
||||
|
пункт 2.4.
Цитата:
|