InputBox глюк
Модератор: Модераторы
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
InputBox глюк
Во вчерашней сборке проявилась замечательная глюка
Было Lazarus 0.9.29 r25120 FPC 2.4.1 i386-win32-win32/win64
Стало Lazarus 0.9.29 r25198 FPC 2.4.1 i386-win32-win32/win64
Было Lazarus 0.9.29 r25120 FPC 2.4.1 i386-win32-win32/win64
Стало Lazarus 0.9.29 r25198 FPC 2.4.1 i386-win32-win32/win64
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Little_Roo 06.05.2010 14:37:12, всего редактировалось 1 раз.
FPC тут не причем, все дело в LCL Lazarus,
даже пересобранный с ключем -dOldAutoSize ничего не дает, видимо что-то другое "пилят"...
даже пересобранный с ключем -dOldAutoSize ничего не дает, видимо что-то другое "пилят"...
alaken писал(а):FPC тут не причем, все дело в LCL Lazarus,
даже пересобранный с ключем -dOldAutoSize ничего не дает, видимо что-то другое "пилят"...
возможность использовать OldAutoSize была недавно удалёна из LCL.
баг уже отрапортован: http://bugs.freepascal.org/view.php?id=16415
скорее всего исправят вечерком.
скалогрыз писал(а):...возможность использовать OldAutoSize была недавно удалёна из LCL.
AutoSize допилили?
тенденция нехорошая, чаще ломают чем что-то делают...
alaken писал(а):AutoSize допилили?
тенденция нехорошая, чаще ломают чем что-то делают...
да вообще негодяи! наобещали с три короба и бесплатно, а теперь баги заставляют огребать! и ещё ехидную приписочку к транку написали: "используете на свой страх и риск"! нужно срочно переходить на Delphi... или нет лучше сразу на Си!
скалогрыз писал(а):alaken писал(а):AutoSize допилили?
тенденция нехорошая, чаще ломают чем что-то делают...
да вообще негодяи! наобещали с три короба и бесплатно, а теперь баги заставляют огребать! и ещё ехидную приписочку к транку написали: "используете на свой страх и риск"! нужно срочно переходить на Delphi... или нет лучше сразу на Си!
повеселило Ваше ехидство =)
alaken писал(а):повеселило Ваше ехидство =)
сейчас в моде слово троллинг
но если кому кровь и носа (срочно под винду), нужен рабочий InputQuery вместо
,то можете использовать этот наколеннособранный патч
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Троллинг
не знал, довольно позновательно.
вот попытался разобраться
в файле inputdialog.inc метод ShowInputDialog создает окно диалога
поменял Align := alTop; на Align := alBottom;
результат во вложении,
PS Autosize починили, взялись за Align...
не знал, довольно позновательно.
вот попытался разобраться
в файле inputdialog.inc метод ShowInputDialog создает окно диалога
поменял Align := alTop; на Align := alBottom;
Код: Выделить всё
function ShowInputDialog(const InputCaption, InputPrompt : String;
MaskInput : Boolean; var Value : String) : Boolean;
function ActiveMonitor: TMonitor; inline;
begin
if Screen.ActiveCustomForm <> nil then
Result := Screen.ActiveCustomForm.Monitor
else
if Application.MainForm <> nil then
Result := Application.MainForm.Monitor
else
Result := Screen.PrimaryMonitor;
end;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
MinEditWidth: integer;
AMonitor: TMonitor;
begin
Result := False;
Form := TForm(TForm.NewInstance);
Form.DisableAutoSizing;
Form.CreateNew(nil, 0);
with Form do
begin
BorderStyle := bsDialog;
Caption := InputCaption;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
Caption := InputPrompt;
//Align := alTop;
Align := alBottom;
AutoSize := True;
end;
Position := poScreenCenter;
Edit := TEdit.Create(Form);
with Edit do
begin
Parent := Form;
//Align := alTop;
Align := alBottom;
BorderSpacing.Top := 3;
AMonitor := ActiveMonitor;
// check that edit is smaller than our monitor, it must be smaller at least
// by 6 * 2 pixels (spacing from window borders) + window border
MinEditWidth := Min(AMonitor.Width - 20, Max(260, AMonitor.Width div 4));
Constraints.MinWidth := MinEditWidth;
Text := Value;
TabStop := True;
if MaskInput then
begin
EchoMode := emPassword;
PasswordChar := '*';
end else
begin
EchoMode := emNormal;
PasswordChar := #0;
end;
TabOrder := 0;
end;
with TButtonPanel.Create(Form) do
begin
Parent := Form;
ShowBevel := False;
ShowButtons := [pbOK, pbCancel];
//Align := alTop;
Align := alBottom;
end;
ChildSizing.TopBottomSpacing := 6;
ChildSizing.LeftRightSpacing := 6;
AutoSize := True;
// upon show, the edit control will be focused for editing, because it's
// the first in the tab order
Form.EnableAutoSizing;
if ShowModal = mrOk then
begin
Value := Edit.Text;
Result := True;
end;
Form.Free;
end;
end;результат во вложении,
PS Autosize починили, взялись за Align...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
alaken писал(а):создает окно диалога
поменял Align := alTop; на Align := alBottom;
отличное решение!
скалогрыз писал(а):alaken писал(а):создает окно диалога
поменял Align := alTop; на Align := alBottom;
отличное решение!
Ваш патч делает практически тоже самое.
но это костыли, проблема глубже...
я несколько запоздал с решением, пересобирал Lazarus, тестировал.
Добавлено спустя 2 минуты 14 секунд:
может это не глюк вовсе а фича...
этот глюк с Align уже давно имеется. При чем он по "не земным" законам порядка периодически проявляется в разных ситуациях. Борюсь с этим во время OnShow: проходом по всем выровненным компонентам, присуждая им по очереди нуль в сторону выравнивания.
Равняем по верхнему краю от меньшего к большему
Равняем по левому краю в порядок (слева-направо) 2 1 3
Равняем по верхнему краю от меньшего к большему
Код: Выделить всё
Label1.Align := alTop;
Label2.Align := alTop;
Label3.Align := alTop;
Label3.Top := 0;
Label2.Top := 0;
Label1.Top := 0;
Равняем по левому краю в порядок (слева-направо) 2 1 3
Код: Выделить всё
Label1.Align := alLeft;
Label2.Align := alLeft;
Label3.Align := alLeft;
Label3.Left := 0;
Label1.Left := 0;
Label2.Left := 0;
Последний раз редактировалось VirtUX 10.05.2010 14:18:00, всего редактировалось 1 раз.
-
Павел Ишенин
- постоялец
- Сообщения: 475
- Зарегистрирован: 24.03.2007 09:16:52
Это не баг. Это особенность работы Align. Если есть на форме Control1 с align alTop и Top = 0 и мы хотим добавить на форму Control2 с align = alTop - то как нам его поместить над Control1? В delphi достаточно присвоить Control2 align = alTop и Top = 0 - он поместится над Control1. Это теперь также работает в Lazarus.
Но, некоторый код был написан без учета этого, и в результате старые ошибки всплыли на поверхность.
Но, некоторый код был написан без учета этого, и в результате старые ошибки всплыли на поверхность.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
Вроде починили
- Lazarus 0.9.29 r25309 FPC 2.4.1 i386-win32-win32/win64
Добавлено спустя 7 минут 39 секунд:
Была (уже для теста) голая форма и вызов InputBox - выравнивать там было нечего
Кстати, ShowMessage как работало нормально, так и ...тьфу-тьфу, чтоб не сглазить...нормально отображает....
Починка видимо в Lazarus 0.9.29 r25309 FPC 2.4.1 i386-win32-win32/win64
Добавлено спустя 7 минут 39 секунд:
Павел Ишенин писал(а):Это не баг. Это особенность работы Align. Если есть на форме Control1 с align alTop и Top = 0 и мы хотим добавить на форму Control2 с align = alTop - то как нам его поместить над Control1? В delphi достаточно присвоить Control2 align = alTop и Top = 0 - он поместится над Control1.
Была (уже для теста) голая форма и вызов InputBox - выравнивать там было нечего
Кстати, ShowMessage как работало нормально, так и ...тьфу-тьфу, чтоб не сглазить...нормально отображает....
Починка видимо в Lazarus 0.9.29 r25309 FPC 2.4.1 i386-win32-win32/win64
