Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Вниз

Изменения размеров формы   Найти похожие ветки 

 
NVMZ   (2009-04-11 02:56) [0]

Как сделать форму, чтобы она раздвигалась по X и не раздвигалось по Y пользователем, причем при изменении размеров кнопок управления окном элементы формы рисовались правильно (не накладывались друг на друга)?
Необходимо, чтобы работало в NT-2000


 
Германн ©   (2009-04-11 03:17) [1]


>
> NVMZ   (11.04.09 02:56)
>
> Как сделать форму, чтобы она раздвигалась по X и не раздвигалось
> по Y пользователем, причем при изменении размеров кнопок
> управления окном элементы формы рисовались правильно (не
> накладывались друг на друга)?

Невидимы твои пути, создатель! :)

P.S.
А на русский вопрос перевести?:
Или дать пример, блин, кода?


 
NVMZ   (2009-04-11 04:01) [2]

Ну, не знаю, как лучше сформулировать вопрос. Думаю, что Свойства:Экран-Оформление-Элемент(Кнопки управления окном - Размеры), прояснят заданный вопрос.


 
Григорьев Антон ©   (2009-04-11 07:48) [3]

Есть такое свойство - Constraints, -  которое определяет ограничения на размеры окна. Если через него на высоту установить одинаковый максимальный и минимальный размер, то у такого оуна можно будет менять только ширину.

Что касается правильного расположения компоннтов, то в такой общей формулировке вопрос не имеет ответа. Всё сильно зависит от того, что в вашем конкретном случае является критерием правильности, а также от того, какие именно компоненты используются.


 
NVMZ   (2009-04-12 01:16) [4]

Форма простая - например, одна кнопка OK. А лучше - Edit, привязанный к левому и правому краю. А кнопка привязана к правому краю. Если установить:
Constraints.MaxHeight:=H; (H-высота формы)
Constraints.MaxWidth:=0;
Constraints.MinHeight:=H;
Constraints.MinWidth:=W; (W -Минимальная ширина формы), то форма будет вести себя, как задано в вопросе. Но при изменении размеров кнопок управления окном элементы формы (средствами Windows, значительное увеличение) кнопка будет накладываться на элемент Edit. Т.е. Constraints как раз и мешает.
Можно, конечно, в OnResize:
ClientHeight:=Hcl; (Hcl-высота клиентской части формы), но при этом форма "мигает" при попытки изменить высоту.
Событие WM_SETTINGCHANGE приходит после перерисовке формы;
Пробовал в OnCanResize что-то подобное делать. Тоже плохо.


 
Германн ©   (2009-04-12 01:26) [5]


> NVMZ   (12.04.09 01:16) [4]

Похоже ты ищешь простой ответ на "вечный" вопрос. :(
Я лично не видел пока программ, которые "идеально" бы выглядели при ЛЮБЫХ настройках Windows.


 
Кролик Иа-Иа2   (2009-04-12 03:13) [6]

Удалено модератором


 
Юрий Зотов ©   (2009-04-12 13:09) [7]


type
 TForm1 = class(TForm)
 private
   procedure WMSizing(var Message: TWMMoving); message WM_SIZING;
   procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
 end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
 inherited;
 with Message do
 case Result of
   HTTOP, HTBOTTOM:
     Result := HTNOWHERE;
   HTTOPLEFT, HTBOTTOMLEFT:
     Result := HTLEFT;
   HTTOPRIGHT, HTBOTTOMRIGHT:
     Result := HTRIGHT
 end
end;

procedure TForm1.WMSizing(var Message: TWMMoving);
begin
 with Message, DragRect^ do
   case Edge of
     WMSZ_BOTTOM, WMSZ_BOTTOMLEFT, WMSZ_BOTTOMRIGHT:
       Bottom := Top + Height;
     WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT:
       Top := Bottom - Height
   end;
 inherited
end;

PS
Ну не люблю я Constraints, глючат они.


 
NVMZ   (2009-04-12 23:06) [8]

С утра хотел написать, что я думаю об форуме. Типа нет ни одного Мастера на форуме, и перенесли серьезный вопрос в раздел "Начинающим".
Однако.... Ответ Юрия Зотова меня порадовал - есть Мастера! Предложенное решение очень элегантное. Мой коллектив до этого не до пер.
На тестовых примерах работает великолепно, сегодня вставлю в основную программу и завтра отдам тестировщикам. Одного не понял - зачем нужен метод procedure WMSizing(var Message: TWMMoving); message WM_SIZING;. Вроде и без него работает. Если Вас не затруднит, сообщите.

Спасибо, Юрий!

Николай Макаров-Землянский, д.т.н., профессор МГУ, зав. лаб. Компьютерной безопасности НИВЦ МГУ.


 
Юрий Зотов ©   (2009-04-12 23:39) [9]

> зачем нужен метод procedure WMSizing(var Message: TWMMoving)

Чтобы запретить изменение вертикального размера формы... с клавиатуры. Через системное меню.
:o)

P.S.
Николай, поверьте, здесь немало Настоящих Мастеров. И именно с большой буквы. И даже совсем не обязательно с голубым значком. Кстати, мой ответ к Мастерским вовсе не относится - это всего лишь азбука Windows.

P.P.S.
Просто у этого форума есть некоторые особенности. Увы.
:o)

P.P.P.S.
Но к ним можно привыкнуть. Или к ним можно отнестись с юмором. Резвятся хлопцы... ну и пусть себе. Пройдет постепенно.
:о)

Кстати, среди этих резвящихся хлопцев тоже есть Настоящие Мастера.
Чес-слово.
:o)


 
Германн ©   (2009-04-13 00:58) [10]


> NVMZ   (12.04.09 23:06) [8]
>
> С утра хотел написать, что я думаю об форуме. Типа нет ни
> одного Мастера на форуме, и перенесли серьезный вопрос в
> раздел "Начинающим".

Хорошо что расхотел :)
Однако, если на сём форуме и далее есть желание получать ответы, то стОит поучиться задавать вопросы так, чтобы максимально снизить количество "уточняющих" вопросов.


 
Германн ©   (2009-04-13 01:58) [11]

Да и "зав. лаб." меня смущает...
:(


 
Kolan ©   (2009-04-14 14:59) [12]

Возможно для того, чтобы контролы не накладывались им нужно задать правильные якоря (anchors).


 
NVMZ   (2009-04-15 01:50) [13]

Естественно, что все якоря у элементов формы стоят правильно. Исчерпывающий ответ на мой вопрос дал Юрий Зотов (7-ое сообщение).


 
Германн ©   (2009-04-15 02:06) [14]


> NVMZ   (15.04.09 01:50) [13]
>
> Естественно, что все якоря у элементов формы стоят правильно.
>  Исчерпывающий ответ на мой вопрос дал Юрий Зотов (7-ое
> сообщение).
>

Якоря то стоят. Я в этом не сомневаюсь.
Я сомневаюсь только в том, что ответ Юрий Зотов ©   (12.04.09 23:39) [9] исчерпывающий.
Но не потому, что ЮЗ чего-то не знает. (он то многое знает, на то он и ЮЗ :)
Я всё ещё не полностью понимаю твой вопрос.
Может дело в том, что я такой тупой!?


 
Игорь Шевченко ©   (2009-04-15 02:37) [15]

NVMZ   (12.04.09 23:06) [8]


> С утра хотел написать, что я думаю об форуме. Типа нет ни
> одного Мастера на форуме


И впрямь нету, да и нафиг они не нужны. Или вы всерьез расчитывали, что мастера начнут локтями толкаться, чтобы побыстрее ответ на не до конца понятный вопрос написать ? :)


 
Германн ©   (2009-04-15 02:51) [16]


> Игорь Шевченко ©   (15.04.09 02:37) [15]

Игорь, не стоит так кипятиться по такому поводу!
Или ты не встречал "начальников" с" псевдо" степенями?
Не верю. :)


 
Германн ©   (2009-04-15 03:10) [17]

Ох, сколько я встречал подобных!


 
KSergey ©   (2009-04-15 07:42) [18]

> NVMZ   (12.04.09 23:06) [8]
> С утра хотел написать, что я думаю об форуме.

Удивительное дело! По-русски понятно изложить чего ж надобно - не умеем, зато мнеие об окружающих составить - это легко.


 
KSergey ©   (2009-04-15 07:44) [19]

Вопросик топикстартеру можно?
Я не понял как метод, предложенный ЮЗ, решил вашу проблему с наезжанием контролов? По сути это другая реализация поведения constraint, если надо не позволять изменять вертикальный размер. Чем он принципиально (для вас! мотивы ЮЗ я понимаю) лучше?


 
NVMZ   (2009-04-15 20:19) [20]

Я не буду отвечать на наезды Германна типа:
"Или ты не встречал "начальников" с" псевдо" степенями?"
Кто меня знает, тот просто улыбнется.

Отвечаю на вопрос KSergey.  Если сделать форму, как сказано в [4], то при изменении размеров кнопок управления окном, элементы формы будут наезжать друг на друга. Это даже видно в примере, который выдается при этом действии.
Суть состоит в том, что элементы формы располагаются на поле высотой = ClientHeight, а задание Constraints.MaxHeight не дает увеличить высоту всей формы (Height). Таким образом при увеличении размеров заголовка окна (например, путем увеличения размеров кнопок управления окном) ClientHeight будет уменьшана. Что приведет к тому, что элементы наедут друг на друга.
Алгоритм Юрия Зотова решил мою проблему.


 
NVMZ   (2009-04-15 20:39) [21]

Персонально для Германна (но можно и для всех). Если Вы такой крутой Мастер, то предложите решение следующей задачи:
"Необходимо вычислить сумму чисел (вещественных - double), вводимых с клавиатуры, без записи их в массив (память)". Т.е. пользователь вводит последовательно числа, программа их суммирует, пользователь вводит Enter, программа выдает ответ.


 
Игорь Шевченко ©   (2009-04-15 20:42) [22]


> Если Вы такой крутой Мастер


мы тут вообще не крутые ни разу и на слабо тоже не ведемся. Это в порядке справки информация.


 
NVMZ   (2009-04-15 21:01) [23]

Добавление к [21]. А то опять обвинят, что вопрос не понятный.
Процессор - Intel Pentium (любой). ОС - Windows, UNIX (любые). Система программирования - C, Pacal/Delphi.


 
Игорь Шевченко ©   (2009-04-15 21:32) [24]


> "Необходимо вычислить сумму чисел (вещественных - double),
>  вводимых с клавиатуры, без записи их в массив (память)".
>  Т.е. пользователь вводит последовательно числа, программа
> их суммирует, пользователь вводит Enter, программа выдает
> ответ.


Можно глупый вопрос - а нафига такая программа нужна ?


 
Anatoly Podgoretsky ©   (2009-04-15 21:40) [25]

> Игорь Шевченко  (15.04.2009 21:32:24)  [24]

Без нее зачет не получить.


 
NVMZ   (2009-04-15 21:46) [26]


> Можно глупый вопрос - а нафига такая программа нужна ?

С датчика поступают данные. Очень много - в память не умещаются. Через неделю работы программы надо получить их сумму.


 
app ©   (2009-04-15 21:46) [27]

Один вопрос одна ветка, два вопроса две ветки и т.д.


 
@!!ex ©   (2009-04-15 22:08) [28]

> [21] NVMZ   (15.04.09 20:39)

А это проблема вообще??
Счетчик и к нему при каждом вводе прибавляется новое значение.
Задачка для дебилов, но никак не для мастеров(может я опять вопроса не понял??)


 
Юрий Зотов ©   (2009-04-15 22:44) [29]

> NVMZ   (15.04.09 20:39) [21]

Николай, Вы, конечно, извините, но профессору МГУ, да еще и д.т.н. задавать подобные вопросы просто стыдно. Эта задачка для детишек, которые только-только начали изучать любой язык. Пишется такая программа за 5 минут, без всякого преувеличения и без малейших раздумий. Например:

var
 S: string = "";
 Sum: double = 0;
begin
 while UpperCase(S) <> "SUM" do
 begin
   ReadLn(S);
   Sum := Sum + StrToFloatDef(S, 0)
 end;
 WriteLn(Sum);
 ReadLn
end.

В связи с чем вынужден огорчиться. Если профессор и д.т.н. не может этого сделать, то чего же следует ожидать от его студентов?


 
NVMZ   (2009-04-15 22:52) [30]


> Пишется такая программа за 5 минут, без всякого преувеличения
> и без малейших раздумий

Пример входных значений:
1, 1e30, 1, -1e30
Правильный ответ - 2.
Ваша программа даст - 0.


 
AndreyV ©   (2009-04-15 23:02) [31]

> [30] NVMZ   (15.04.09 22:52)
> Пример входных значений:
> 1, 1e30, 1, -1e30
> Правильный ответ - 2.
> Ваша программа даст - 0.

Начинают открываться скрытые условия.


 
Юрий Зотов ©   (2009-04-15 23:11) [32]

> NVMZ   (15.04.09 22:52) [30]

Николай, не смешите. Особенности работы с числами, отличающимися на много порядков, я знаю не хуже Вас (плохо обусловленных систем нарешался в свое время). Но кроме этого я знаю еще и технику, а потому ни за что не поверю, что Ваш датчик способен выдавать сигнал в диапазоне от -1e30 до +1e30. Вы это просто придумали. Извините, из пальца.


 
NVMZ   (2009-04-15 23:22) [33]


> Ваш датчик способен выдавать сигнал в диапазоне от -1e30
> до +1e30. Вы это просто придумали.

Датчик придумал в ответ на вопрос:

> Можно глупый вопрос - а нафига такая программа нужна ?

Это задача 1-го семестра 1-го курса мех-мата МГУ. В форуме есть такой ответ:

> Без нее зачет не получить

Я ее привел для Германна. Вроде простая задача, но не все так просто.
Однако решение ее существует. Я знаю два. Одно мое. Другое студенты предложили.


 
Юрий Зотов ©   (2009-04-15 23:28) [34]

> NVMZ   (15.04.09 23:22) [33]

Навскидку - еще одно решение (на его оригинальность не претендую): разбиваем диапазон датчика на поддиапазоны, при вводе считаем частичные суммы, в конце считаем общую.


 
Игорь Шевченко ©   (2009-04-15 23:41) [35]


>  Я знаю два. Одно мое


другое неправильное.

Вы бы эта...уважаемый доктор всея Руси, со своими вопросами на засыпку шли бы в http://www.delphimaster.ru/cgi-bin/forum.pl?n=3


 
NVMZ   (2009-04-15 23:44) [36]


> Навскидку - еще одно решение (на его оригинальность не претендую):
>  разбиваем диапазон датчика на поддиапазоны, при вводе считаем
> частичные суммы, в конце считаем общую.

Да. Это правильно! По-моему, там будет 37(?) таких переменных (частичные суммы).
Второе решение - написать свою арифметику. За это решение я поставил зачет-автомат.
Кстати, на БЭСМ-6 Ваша программа будет работать правильно. Надеюсь, Вам пояснять не надо.
Однако можно открыть дискуссию "машинная арифметика для начинающих" (как добавить смайлик не знаю).

Очень приятно с Вами общаться! Спасибо.



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

Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.009 c
3-1215112673
Real
2008-07-03 23:17
2009.05.31
Open Office - Base


2-1239887719
Kolan
2009-04-16 17:15
2009.05.31
TToolButton и Диспетчер драйверов ODBC


11-1201031180
AndreyUT
2008-01-22 22:46
2009.05.31
Определить когда курсор покинул ссылку в richedit


10-1158130464
GrBob
2006-09-13 10:54
2009.05.31
ITypeInfo и имя интерфейса-предка.


9-1180082560
@!!ex
2007-05-25 12:42
2009.05.31
Переброска изображения между Рендеринг Таргетами.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский