Урок Delphi 13

Создание интерфейса пользователя




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



Скидки на уф лампы для гель лака тут киев.

   Создание интерфейса пользователя сводится к выбору из палитры компонентов необходимые для работы программы компоненты Delphi, служащие интерфейсом управления, а также интерфейсом отображения информации, и перенесение их на Форму с последующей компоновкой.

   Интерфейс пользователя, создаваемый Вами, должен использовать стандартные, привычные пользователям элементы , и обеспечивать максимальное удобство. Всё это в конечном счёте определяется таким критерием как эффективность интерфейса - максимальный результат с минимальными усилиями.
   Принципы создания удобного интерфейса известны. В качестве самых общих принципов при создании пользовательских интерфейсов можно рассматривать три основных положения:

  1. Программа должна помогать выполнить задачу, а не становиться этой задачей.
  2. При работе с программой пользователь не должен ощущать себя дураком.
  3. Программа должна работать так, чтобы пользователь не считал компьютер дураком.
   Первый принцип — это так называемая "прозрачность" интерфейса. Интерфейс пользователя должен быть интуитивно понятным, простым для освоения, и не создавать для пользователя проблем, которые он вынужден будет преодолевать в процессе работы. Используйте стандартные, без излишнего украшательства компоненты, применяйте привычные, используемые аналогичными программами приёмы управления, и Вы достигнете критериев выполнения первого принципа.

   Второй принцип заключается в пренебрежении интеллектуальными способностями пользователей. На собственном опыте мне известно, что часто пользователи не только не умеют работать за компьютером, но и просто боятся предпринять что-либо самостоятельно. Поэтому интерфейс пользователя должен быть максимально дружественным.
   Тем более, что опасения пользователей зачастую оправданны, ведь стоимость программы, да и самого компьютера не идёт ни в какое сравнение со стоимостью, например, созданной многолетними усилиями базы данных. Именно поэтому программист при создании интерфейса пользователя обязан всегда встраивать в программу "защиту от дурака" - от неправильных действий и ввода пользователем неверных данных. Но некоторые программисты чересчур увлекаются такой защитой, делают ее слишком назойливой, и в результате работа программы напоминает знаменитое "шаг влево, шаг вправо считается побегом"! И то, что программист создаёт как решение проблемы, само начинает создавать проблемы.
   Для соблюдения второго принципа не нужно позволять программе "исправлять" действия пользователя и указывать, что как именно ему действовать, загоняя в узкие рамки. Также не следует чрезмерно увлекаться выводом информационных сообщений-подсказок, особенно диалоговых, это отвлекает пользователя от работы. А лучше вообще предусмотреть возможность отключения подсказок.

   Третий принцип заключается в том, чтобы создавать программу с максимально возможными "умственными" способностями. Несмотря на быстрое развитие компьютерной техники, даже широко распространённые программы лишь весьма условно можно назвать имеющими искуственный интеллект. Они мешают работе пользователя, выводя на экран диалоговые окна с глупыми вопросами, вызывающими недоумение даже в простейших ситуациях. В результате пользователи в сердцах восклицают: "Ну и тупая же эта машина"!
   У меня лично вызывают раздражение постоянные вопросы практически всех текстовых редакторов о том, не сохранить ли изменённый текст, хотя первоначальный и нынешний текст не отличаются ни символом. Да, я что-то набирал, но потом вернул всё назад, неужели нельзя сообразить! Приходится проверять, не испортил ли я всё-таки что-нибудь.

   Старайтесь придерживаться следующих правил:

Стандартные элементы интерфейса
   Используйте стандартные для данного элемента интерфейса компоненты. Встретив Вашу программу, пользователь не будет терять время на знакомство, а сразу приступит к работе - это один из признаков профессионально сделанной программы.
Небольшая палитра инструментов
   Старайтесь использовать не слишком большое количество разнообразных компонентов. И естественно, использовав где-то в одном месте один стандартный компонент, в аналогичном случае также применяйте именно его.
Одинаковое расстояние между элементами управления
   Располагайте элементы интерфейса на одинаковом расстоянии между собой. Разбросанные как попало компоненты создают ощущение непрофессионально сделанного продукта. И наоборот, тщательно выверенное размещение на Форме кнопок, переключателей, флажков и других компонентов, составляющих интерфейс — признак качественной работы.
TabOrder. "Правильный" порядок
   TabOrder - это порядок перемещения экранного курсора по элементам управления при нажатии клавиши Tab. В правильно написанной программе курсор перемещается, следуя логике работы пользователя с программой. При создании же программы программист часто меняет компоненты, одни удаляет, другие добавляет по мере необходимости. В результате в готовой программе курсор хаотично скачет по Форме. Завершив программу, не забывайте настроить TabOrder.
Выбор шрифтов
   Шрифты просто оставьте в покое. Заданные по умолчанию самой Delphi шрифты подойдут для любой системы, на которой может работать Ваша программа. Полужирный шрифт используйте только для выделения важных элементов. Применение же курсива и особенно подчёркивания, которое пользователь может принять за гиперссылку - дурной тон.
Выбор цветов
   Что касается цветов элементов интерфейса, то также, как и в случае со шрифтами, лучше оставьте их стандартными, по умолчанию. Delphi использует системную палитру Windows, и пользователь, изменив её, легко настроит цвета под себя.
Альтернативное управление
   Профессионально сделанная программа должна иметь возможность управляться не только мышкой, но и с клавиатуры. Не должно быть функций, доступных выполнению только мышью (рисование в графических редакторах не в счёт!). Для наиболее используемых функций следует предусмотреть "горячие клавиши" для их быстрого вызова.
Кирпичики интерфейса
   Что касается конкретных элементов интефейса пользователя, то качество взаимодействия пользователя с программой зависит от:    А сейчас хочу показать, какие инструменты предлагает Delphi для управления компонентами на Форме, их взаимным расположением и поведением курсора при нажатии клавиши Tab.

   Для того, чтобы расположить относительно друг друга компоненты в правильном порядке, сначала необходимо их выделить. Можно просто обвести мышкой область на Форме, в которой содержатся выбранные компоненты. Или, удерживая "Shift", указать той же мышкой каждый подлежащий выделению компонент. Повторный щелчок мышкой по выделенному компоненту (при нажатом "Shift") снимает с него выделение.

   Выделенными компонентами можно управлять как единым целым - передвигать по Форме, присвоить значение одинаковым свойствам, скопировать (для установки, например, на другую Форму), даже удалить.

Выделение мышкой области
с компонентами
Группа выделенных компонентов







   Теперь щёлкните правой кнопкой по одному из компонентов, и из "всплывающего" меню выберите  Position -> Align... Появится диалоговое окошко, позволяющее настроить положение компонентов в группе по горизонтали и вертикали. Например, нам нужно выровнять наши четыре кнопки по левому краю и сделать так, чтобы между ними было одинаковое расстояние по вертикали. Для этого выделим радиокнопки Horizontal: Left sides и Vertikal: Space equally.


Доступ к меню выравнивания


Диалог выравнивания компонентов

Результат выравнивания группы компонентов





   Выбрав пункт Center, мы расположим компоненты так, что их центры будут располагаться на одной линии по горизонтали или вертикали, а пункт Center in window перемещает компоненты в центр окна, также по горизонтали или вертикали.

   В этом же меню строка Tab Order... вызывает появление диалогового окна, управляющего перемещением курсора по элементам интерфейса при нажатии клавиши Tab. В момент появления Формы на экране курсор будет находиться, естественно, на компоненте, располагающемся на первой строчке диалогового окна. И далее будет перемещаться вниз по списку. На диалоговом окне две синие стрелочки "вверх" и "вниз" управляют положением выделенного компонента. Выделяйте нужный компонент, стрелками перемещайте на нужную строчку в списке, и так далее.

   При выборе пункта меню Control -> появляется подменю, состоящее из двех пунктов:
  • Bring to Front
  • Send to Back
   Это методы компонента, доступные также программно. Button1.SendToBack перемещает кнопку на "задний план", а Button1.BringToFront - на "передний план". То есть, если один компонент располагается над другим, эти методы меняют их местами. Случаи, в которых это может применяться, довольно очевидны.


Работа со строками Delphi           В начало урока          Следующий урок Delphi  

Уроки Delphi начинающим



Вопросы и комментарии (50)      Решение задач в Delphi

Екатерина, добавлено 1.07.10, 13:45:08 
Автору огромное спасибо! Случайно нашла ваш сайт). Очень понравилось-прочитала всё, хотя уже многое знала. Правда изучаю я не delphi, a Lazarus)). Есть некоторые отличия). Надеюсь Вы и дальше продолжите писать. Хотелось бы поподробней узнать о некоторых компонентах (например, StringGrid). О всех возможностях и невозможностях этих компонентов. И еще, например, меня очень интересует работа с таблицами MySQL. С уважением, Екатерина.))
Автор, добавлено 1.07.10, 15:29:30 
Дважды спасибо. Lazarus посмотрю! А про StringGrid (и другие компоненты Delphi) есть странички.
Илья, добавлено 16.08.10, 01:35:11 
Действительно автору большое спасибо! Только начинаю работать в delphi, очень помогает. Мне бы было интересно возможность использование delphi в OLE-технологиях, для автоматизации, например, Excel. Заранее спасибо, Илья.
Автор, добавлено 16.08.10, 06:09:05 
Спасибо за признание, и высказанный интерес. Действительно, автоматизация - именно то, за что мы любим Delphi! Постараюсь изложить это подоступнее.
Виктория, добавлено 31.08.10, 12:30:27 
Огромное спасибо за Ваш труд!!! Я вообще в программировании полнейший чайник,но приходится изучать, мне это нравится, но очень много непонимаю пока. Благодаря вашим урокам в некоторых вопросах у меня уже появилось твёрдое понимание. Спасибо вам огромное!!!!! И спасибо за Ваше человеческое общение. На многих сайтах на поставленный вопрос можно столько грубых фраз услышать от опытных программеров... И почему то в других отраслях опытные люди с удовольствием передают свой опыт, а вот в программировании опытные только насмеиваются над новичками.
Жду с нетерпением продолжения уроков!!!
автору респект, добавлено 15.12.10, 22:56:35 
от души за материал! очень все просто и примитивно для начинающих, помогает!
Иван, добавлено 4.01.11, 18:44:35 
Привет автор :) Я думаю ты не забыл именно меня, я тоже сюда не мало смотрю :) Так вот снова нуждаюсь в вашей помощи. Так вот все мучает вопрос, точнее 2 вопроса.
1. Как сделать, чтобы подсказка, вылетающая при наведении курсора мыши над каким-то компонентом, имеющим возможность вывода подсказок, сделать чтобы подсказка отображалась постоянно после появления до тех пор, пока курсор мыши не "уйдет" с этого компонента.
2. У компонента кнопки есть свойство Cursor. Так вот ты знаешь для чего оно служит и что курсор меняется при наведении на тот, который стоит в свойстве. Так вот суть в следующем: когда любой человек сидит на интернет страницах, то мы часто переходим по ссылкам на сайтах и если к примеру стоят курсоры Aero да и просто стандартные, то курсор меняет свой вид на руку с указательным пальцем. Так вот в делфи эта рука не совсем похожа да и вообще складывается ощущение что это как раз старая версия рук, с более старых версий Windows. Так вот к чему я клоню, как сделать такую же руку, которой так скажем пользуюсь я, которая заложена в системе. При выборе курсора при проектировании программы в делфи там как-бы курсоры, что я пользуюсь в системе, но вот рука там не такая как в системе. Как добиться того, чтобы она была как в системе, точно такая же. Я думаю есть способы как это сделать.
Спасибо за внимание, опять целую поэму накатал :D
Жду ответа :)
Автор, добавлено 4.01.11, 22:06:27 
Здравствуй Иван, меня зовут Андрей, очень приятно! )))

Ответы на эти два вопроса в чём-то схожи. И набор курсоров, и свойства подсказки - относятся к такому объекту, как Application. Первый вопрос более прост:
  Application.HintHidePause: Integer; (мсек) - время ожидания до скрытия подсказки. Можно установить при старте программы, по событию Формы OnCreate.
Нет значения, вызывающего бесконечное ожидание, просто установите побольше, 3600 000 - будет час показывать, достаточно?

Второй вопрос давай завтра...
Иван, добавлено 4.01.11, 22:43:12 
И мне очень приятно, Андрей :). Да, часа будет вполне достаточно, спасибо :). Уже даже опробовал. Буду ждать ответа на второй вопрос завтра :)
Иван, добавлено 4.01.11, 22:46:12 
Еще что забыл сказать, я это сделал не в OnCreate главной формы, а в Project1.dpr. Зайдя в горизонтальной меню пункт Project->View Sourse и перед строкой Application.Run написал Application.HintHidePause:=36000000. Я думаю так даже будет лучше.
Автор, добавлено 5.01.11, 10:53:21 
Продолжаем разговор.
С курсорами "немного" соврал - это свойства не Application, а другого глобального объекта - Screen. В Delphi есть зарезервированные курсоры, их номера, судя по справке Delphi, от минус 1 (-1) до минус 22 (-22). Их мы и видим, если выйдем в Инспекторе объектов на свойство компонента Cursors. Только там они имеют зарезервированные имена, константы, равные этим числам. Итак, нам нужно добавить в программу свои курсоры. Вот простой способ.

Нужно загрузить курсор, и присвоить ему номер больше нуля, чтобы не совпадал с зарезервированными. Впрочем, можно и подменить любой зарезервированный курсор своим. Итак, возьмём, чисто например, номер 25:

  Screen.Cursors[25]:=LoadCursorFromFile('Файл_с_курсором');

Это, как видим, массив. А вот где взять курсор? В папке Windows\Cursors имеется немало курсоров. В интернете полно коллекций курсоров. Будь вы дизайнером, можете и свой нарисовать, файлы курсоров имеют расширение *.ani и *.cur, в сети есть программы для создания курсоров. Я - не дизайнер...

Теперь у нас есть курсор с номером 25, можете создать константу с этим значением, для наглядности. Для использования с конкретным компонентом, например, кнопкой, пишем:

  Button1.Cursor:=25;

Можно также засунуть курсоры в файл ресурсов. Я пока не буду об этом. Как использовать курсор, какой вам понравился в другой программе, могу вот что сказать. По запросу в гугле "создать курсор" есть ссылка на программу ArtCursors, которая якобы может вытаскивать курсоры отовсюду, редактировать и т.д. Мне не нужно, а вы попробуйте.
Иван, добавлено 5.01.11, 18:06:37 
Благодарю. Но где писать строку "Screen.Cursors[25]:=LoadCursorFromFile('Файл_с_курсором');" я не понял, и при написании подсказка LoadCursorFromFile не выскакивает, а написав в ручную, пишет не идентифицирована переменная.
Автор, добавлено 5.01.11, 18:19:36 
Я написал в OnCreate Формы. Ошибок не было.
Иван, добавлено 5.01.11, 18:26:22 
Все, прощу прощения, разобрался :) Спасибо большое :) Я думаю это самый легкий способ, хотя если в самой делфи сделать к примеру такой курсор по умолчанию, не будет вообще проблем. Еще вопрос, встретил такие функции или как там property, свойства как LoadCursorFromFileА, LoadCursorFromFileW. В чем отличия?
Автор, добавлено 5.01.11, 18:46:25 
Иван, сейчас некогда, я уезжаю, до завтра.
Иван, добавлено 5.01.11, 19:07:58 
Я заметил ты часто в поездках :) Хорошо, до завтра :).
Автор, добавлено 6.01.11, 10:58:27 
Итак, утро вечера мудренее, но не в этом случае. Функция LoadCursorFromFile является API-функцией Windows, и доступна при добавлении в секцию uses модуля Windows. Я залез в этот модуль, там куча функций, и у всех есть как оригинал, так и имя с добавлением A и W. Где-то мельком увидел, что это алиасы, то есть псевдонимы. Иначе говоря, одно и то же. Зачем это надо? Есть много, друг Горацио (то есть Иван) в Windows, что и не снилось нашим мудрецам... (Хотя кто-нибудь и знает).
Иван, добавлено 6.01.11, 20:48:53 
А смысл тогда в этим алиасах? Ну считай копиях? Они все равно чем-то должны отличаться и предназначение у них должно быть другое. Ведь программисты не даром добавили эти 2 функции, ведь я не думаю что они занимались мартышкиным трудом так скажем. А с алиасом я знаком. Работал в Data Base Desktop. И для чего ты упомянул Горацио? Это что?:)
Автор, добавлено 6.01.11, 20:58:58 
Иван, ты думаешь, это попытка обидеть?!! Это просто такое высказывание из Гамлета, означающее, что ответа нет, по крайней мере у меня. Вот.

А у тех функций нет описания, они просто описаны как внешние (external). Вот, дальше мне неинтересно стало копать. Windows их знает... В сети тоже ответа нет. Да и тебе зачем, я думаю, нужно задачу решать, а не создавать себе новые. Какую задачу ты решаешь?
Иван, добавлено 6.01.11, 23:13:38 
Да нет, как попытку обидеть я это не воспринял:) Просто я эту фразу уже встречал, точнее просто имя "Горацио", а теперь ты написал это имя, вот и стало интересно.
И стало быть интересно на счет этих функций. Раз в сети нет описания этих функций, интересно зачем их сделали доступными. Но это чисто интерес.
И на счет задачи, можно сказать это не решение задачи, а общее развитие, изучение нового. На счет курсора, это опять же личное развитие, умение делать что-то еще новое, лично сам с этим столкнулся и захотелось узнать, что к чему, как сделать. И что это реально сделать я не ошибался и в своей программе сделал.
Вообще я это в своей программе использовал, которую сдавал в декабре прошлого года по предмету прикладное программирование. Но ту что сдал как раз без того чего я хотел, теперь усовершенствую свои знания и умения. Но кстати хотелось бы найти способ, без подгрузки курсора извне так скажем, а уже пользоваться тем, что вид указателя уже будет в списке доступных, но сейчас там старый :)
Аноним, добавлено 19.06.11, 10:42:43 
помогите!!!завтра экзамен!!!
Автор, добавлено 19.06.11, 12:13:09 
Надо писать не "помогите", а "спасите, помогите" :). А так ничем помочь не можем.
Глеб, добавлено 2.05.12, 00:01:33 
У меня в программе много вспомогательных форм, которые вызываются с главной, а можно сделать слипание этих придаточных форм т.е. если я вызываю больше одной придаточной и ставлю её рядом с другой то две формы должны склеиться и превратиться в одну и перетаскиваться все вместе, как одна.

Вот можно так?
Татьяна, добавлено 2.05.12, 15:26:10 
Спасибо, вы очень помогли уже, есть маленький вопросик:
как проще избавиться от глюков с модальной формой введения пароля?
У меня эта форма появляэтся вместе с главной формой проекта, но работает
некорректно. Посоветуйте, что-нибудь, пожалуйста. Заранее спасибо.
Автор, добавлено 2.05.12, 15:58:29 
Во, вопрос... Напоминает - найди то не знаю что.

Ну, я бы сделал так. Вторая форма открывается по событию OnActivate первой. На второй форме строка ввода пароля и одна кнопка со значением свойства ModalResult=mrOk. Обработчик OnActivate:

procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.ShowModal;
if Form2.Edit1.Text<>'Пароль' then Close;
end;

Таким образом, если пароль неверен, то и первая форма сразу закрывается. А ещё её можно вначале сделать размером 0х0, чтобы вообще нельзя было посмотреть на неё, сдвинув форму пароля. Дополнительно, можно сам пароль закодировать функцией md5, у меня есть её описание на странице password.php.

Глеб, добавлено 13.05.12, 02:01:58 
Автор, моя программа выполняет опр. действия и мне нужен графический компонент который будет отображать прогресс выполнения. Где такой взять в дельфи 7 лайт???
Автор, добавлено 13.05.12, 09:25:42 
Про Delphi 7 лайт не в курсе. А что, там на странице Win32 нет ProgressBar'a?

В конце концов, поставьте обычный Image, вытяните в струнку, и сами зарисовывайте его цветом на нужную длину (если умеете, конечно). А если не умеете, то подождите, я сегодня опубликую сюда процедуру.
Глеб, добавлено 13.05.12, 12:59:47 
ProgressBar - нашел его у себя. Сейчас почитаю, как с ним работать
Глеб, добавлено 14.05.12, 13:12:54 
Автор, а можно сделать так, чтобы форма всегда сама ставила себя по центру экрана?
Автор, добавлено 14.05.12, 13:26:16 
Чего проще? Посмотрите в Инспекторе Объектов свойство Position, это список - раскройте, сами всё увидите.
Глеб, добавлено 14.05.12, 13:27:24 
И форма сама себя будет ставить на место? хм... вот это класс, сейчас посмотрим
Глеб, добавлено 12.06.12, 15:34:12 
Автор, у меня к вам вопрос есть. вот у меня на форме есть кнопка(выход) и эдит. Я ввел информацию в эдит и нажал на выход, как сделать так чтобы при запуске программы повторно у меня в эдите было то что я писал?
Автор, добавлено 12.06.12, 23:00:29 
Нужно сохранить написанное в файл. И при запуске программы считывать значение в этом файле.
Глеб, добавлено 12.06.12, 23:08:03 
Эм.. я думаю это можно было реализовать если у тебя один эдит, а у меня их под 20, да еще есть и чекбоксы или этот варианты на них распространяется?
Автор, добавлено 12.06.12, 23:15:25 
Какая разница.. Да хоть 100500
Саша, добавлено 7.08.12, 11:17:51 
Привіт
В мене одне питання
Як зробити гарячі клавіші?

Саша, добавлено 7.08.12, 11:36:12 
і ще одне питання:
Де потрібно писати Button1.Cursor:=25?
Автор, добавлено 7.08.12, 14:55:09 
Button1.Cursor:=25

Это откуда взято?
Саша, добавлено 8.08.12, 10:17:06 
Автор, добавлено 5.01.11, 10:53:21
Продолжаем разговор.
С курсорами "немного" соврал - это свойства не Application, а другого глобального объекта - Screen. В Delphi есть зарезервированные курсоры, их номера, судя по справке Delphi, от минус 1 (-1) до минус 22 (-22). Их мы и видим, если выйдем в Инспекторе объектов на свойство компонента Cursors. Только там они имеют зарезервированные имена, константы, равные этим числам. Итак, нам нужно добавить в программу свои курсоры. Вот простой способ.

Нужно загрузить курсор, и присвоить ему номер больше нуля, чтобы не совпадал с зарезервированными. Впрочем, можно и подменить любой зарезервированный курсор своим. Итак, возьмём, чисто например, номер 25:

  Screen.Cursors[25]:=LoadCursorFromFile('Файл_с_курсором');

Это, как видим, массив. А вот где взять курсор? В папке Windows\Cursors имеется немало курсоров. В интернете полно коллекций курсоров. Будь вы дизайнером, можете и свой нарисовать, файлы курсоров имеют расширение *.ani и *.cur, в сети есть программы для создания курсоров. Я - не дизайнер...

Теперь у нас есть курсор с номером 25, можете создать константу с этим значением, для наглядности. Для использования с конкретным компонентом, например, кнопкой, пишем:

  Button1.Cursor:=25;

Можно также засунуть курсоры в файл ресурсов. Я пока не буду об этом. Как использовать курсор, какой вам понравился в другой программе, могу вот что сказать. По запросу в гугле "создать курсор" есть ссылка на программу ArtCursors, которая якобы может вытаскивать курсоры отовсюду, редактировать и т.д. Мне не нужно, а вы попробуйте.
Евгений, добавлено 10.05.13, 11:32:27 
Здравствуйте! Подскажите пожалуйста я пытаюсь записать в ини активный лист, но не выходит.
TabSheet1.ActivePage:=IniFile.ReadInteger('Pages','TabSheet1ActivePage',TabSheet1.ActivePage);

IniFile.WriteInteger('Pages','TabSheet1ActivePage',TabSheet1.ActivePage);
Автор, добавлено 10.05.13, 13:29:17 
Номер активной страницы, то есть того компонента TabSheet который открыт сейчас, определяется так:

N:=IntToStr(PageControl1.TabIndex);

Вот его и сохраняйте.
Евгений, добавлено 11.05.13, 03:49:55 
Спасибо большое подскажите пожалуйста как правильно это записать?
N:=IntToStr(PageControl1.TabIndex):=IniFile.ReadInteger('Pages','(PageControl1TabIndex)',N:=IntToStr(PageControl1.TabIndex));

IniFile.WriteInteger('Pages','(PageControl1TabIndex)',N:=IntToStr(PageControl1.TabIndex));
Автор, добавлено 11.05.13, 09:28:35 
Хм, вы собрались что-то сохранять в ini-файлы, так должны уметь это прежде чем начать работу. Я вам показал - что сохранять, целое число

N:=IntToStr(PageControl1.TabIndex);

Ну почитайте про ini-файлы. А я, кстати, ими не пользуюсь. Просто беру типизированный файл и сохраняю туда все настройки в виде записи с нужными полями. Например, положение Формы, да и вашу активную вкладку так сохраняю:

type TIni = Record
  L, T, N: Integer;
end;

var Ini: TIni;
 FIni: File of TIni;

procedure SaveIni;
begin
  AssignFile(FIni, 'МойИниФайл.ini');
  Rewrite(FIni);
  Ini.L:=Form1.Left;
  Ini.T:=Form1.Top;
  Ini.N:=IntToStr(PageControl1.TabIndex);
  Write(FIni, Ini);
  CloseFile(FIni);
end;
 
Потом аналогично считываю при старте программы этот файл и инициирую Форму. Может это способ и не самый оптимальный, зато прост. А если нужно чтобы файл был текстовый и его можно было просматривать и настраивать вручную - ещё проще. Записываю всё в спец. созданный StringList, и сохраняю как текст, всего делов...
Евгений, добавлено 29.06.13, 18:05:21 
Здравствуйте! Подскажите пожалуйста я пытаюсь сделать чтобы при сворачивании нажав на подменю Свернуть во 2-м подменю(в трее)пункт Свернуть становился не доступным и наоборот при разворачивании становился доступным,а Развернуть не доступным. Я пытался это сделать, но у меня получается что только 1 пункт становиться не доступным и не обращается в исходное положение.
Вот код:

procedure TBDZaryadki1.N8Click(Sender: TObject);
begin
CoolTrayIcon1.HideMainForm;
If Application.ShowMainForm = False then
begin
N8.Enabled:=False
end
else
N8.Enabled:=True;
end;

procedure TBDZaryadki1.N9Click(Sender: TObject);
begin
CoolTrayIcon1.ShowMainForm;
If Application.ShowMainForm = True then
begin
N9.Enabled:=False
end
else
N9.Enabled:=True;
end;
Автор, добавлено 29.06.13, 18:24:14 
А почему у вас только одно присвоение True или False одному лишь пункту? Должно быть оба присвоения, если одному True, то другому False, в другой процедуре наоборот.
Евгений, добавлено 29.06.13, 22:54:42 
Я не совсем понял что вы имеете ввиду!? Я ещё так делал:
procedure TBDZaryadki1.N8Click(Sender: TObject);
begin
CoolTrayIcon1.HideMainForm;
If Application.ShowMainForm = False then
begin
N8.Enabled:=False
end
else
N9.Enabled:=True;
end;

procedure TBDZaryadki1.N9Click(Sender: TObject);
begin
CoolTrayIcon1.ShowMainForm;
If Application.ShowMainForm = True then
begin
N9.Enabled:=False
end
else
N8.Enabled:=True;
end;
Автор, добавлено 30.06.13, 03:36:29 
Евгений, вот вы жмёте N8 - хотите свернуть программу (CoolTrayIcon1.HideMainForm; ), а зачем вы после сворачивания ещё и проверяете (If Application.ShowMainForm = False)? Ну да ладно. Просто потом нужно не

N8.Enabled:=False;

а

N8.Enabled:=False;
N9.Enabled:=True;

Я бы так сделал:

procedure TBDZaryadki1.N8Click(Sender: TObject);
begin
CoolTrayIcon1.HideMainForm;
N8.Enabled:=False;
N9.Enabled:=True;
end;

procedure TBDZaryadki1.N9Click(Sender: TObject);
begin
CoolTrayIcon1.ShowMainForm;
N9.Enabled:=False;
N8.Enabled:=True;
end;

Ну если уж очень нужно проверять, то в else присваивание обоим пунктам тоже, только наоборот.
Евгений, добавлено 30.06.13, 20:05:37 
Большое спасибо!
Проверяю я потому что если приложение при запуске сворачивается тагда должно уже быть N8.Enabled:=False;но у меня не получается,а остальное получилось.
Я думаю может на FormCreat поставить
N8.Enabled:=False;
N9.Enabled:=True;
Евгений, добавлено 30.06.13, 20:11:17 
Всё получилось!
Евгений, добавлено 30.06.13, 20:38:23 
Получилось! Но я столкнулся с проблемой. Оказалось что этого
N8.Enabled:=False;
N9.Enabled:=True;
не достаточно ведь нужно и обратное действие
N9.Enabled:=True;
N8.Enabled:=False;
и я написал процедуру
procedure TBDZaryadki1.FormCreate(Sender: TObject);
begin
If Application.ShowMainForm = False then
begin
N8.Enabled:=True;
N9.Enabled:=False;
end
else
но эта процедура не выполняется
begin
If Application.ShowMainForm = True then
begin
N8.Enabled:=False;
N9.Enabled:=True;
end;
end;
end;
Оставить комментарий:

Имя  

Текст комментария