Как сделать чтобы форма не растягивалась в делфи

Добавил пользователь Alex
Обновлено: 19.09.2024

Апрель 18th, 2013 admin

Продолжаем рассматривать Delphi, все полное описание свойств Вы можете узнать, если нажмете F1. Итак, модуль Forms, класс TCustomForm является базовым для класса форм Tform и некоторых других форм диалоговых окон. По сути получается, что наследники класса могут содержать в себе такие компоненты, как кнопки CheckBox, списки ComboBox (из палитры компонентов) и другие объекты.

Получается, что основные свойства класса TCustomForm можно представить в следующем виде:

Описание

Некоторые события формы:

Описание

. delphi события формы свойства формы делфи delphi 7 свойство формы release delphi form события delphi 7 события afteropen

. delphi 7 форма на у него свойства ComboBox полное описание дельфи ее delphi 7 события edit delphi 7 события afteropen

Иногда, когда я разворачиваю окно во весь экран, вместо того, чтобы разворачивать его внутри среды IDE, он разворачивается на весь экран.

2 ответа

Вы не можете. Конструктор закрепленных форм не был представлен в Delphi до D2005 (а когда он появился, люди жаловались на потерю плавающего конструктора из более ранних версий, поэтому они добавили его обратно в качестве дополнительной конфигурации).

В D7 и более ранних версиях главное окно IDE состояло из меню и панели инструментов, а также палитры встроенных компонентов. Инспектор объектов и конструктор форм были полностью отдельными окнами, как и большинство других доступных окон в то время.

Чтобы получить поддержку внешнего вида и закрепляемого окна в стиле Visual Studio, вам необходимо выполнить обновление как минимум до D2005.

В Delphi 7 в среде IDE есть 3 группы основных окон:

  • Палитра инструментов и компонентов IDE
  • Дизайнеры форм
  • Все остальное (включая редактор кода)

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

Однако хороший дизайн приложения не зависит от такого абсолютного и точного позиционирования форм, и, в частности, в ситуациях с несколькими мониторами он может сам по себе привести к проблемам, поэтому этот подход постепенно становится менее актуальным, и поэтому подход к дизайну встроенных форм более уместен.

По иронии судьбы, 100% встроенный подход означает, что вы больше не можете так легко работать над дизайном форм на одном мониторе, в то время как код виден на втором (по крайней мере, без растягивания всей вашей монолитно встроенной IDE на оба).

Докабельный против монолитного

Идея о том, что идея Delphi 7 не поддавалась стыковке, очень далека от истины. Когда люди говорят это, на самом деле они имеют в виду то, что в нем был конструктор плавающих форм, а не монолитный блок закрепленных окон. Скорее потребовался более гибкий подход.

Однако, за исключением окна инструментов IDE и конструкторов форм, все остальные окна могут и могут быть закреплены в более или менее любой комбинации, которую вы пожелаете, хотя иногда достижение именно желаемого макета было затруднено из-за того, как среда IDE обрабатывала интерфейс перетаскивания, который может привести к множеству неудачных попыток получить то, что вам нужно.

Иногда может помочь отключить функцию автоматической стыковки.

Если Auto Dock включен (iirc по умолчанию), когда вы перетаскиваете окно рядом с местом, где оно может быть закреплено, появляется прямоугольник фокуса, показывающий, где окно будет закреплено, если при этом отпустить (отпустить) точка. Если вы не хотите закреплять окно и хотите только переместить его, вы можете удерживать клавишу ctrl нажатой, чтобы подавить поведение стыковки.

Если Auto Dock выключен, это поведение обратное. То есть перемещение окон - это всегда просто перемещение окон. Если вы хотите перетащить и закрепить и окно, удерживая клавишу ctrl во время перетаскивания, вы получите прямоугольники предварительного просмотра и поведение закрепления при опускании.

Несколько макетов

Однако после того, как вы расположили окна так, как вы хотите, вы можете сохранить это расположение и присвоить этому макету метку. Различные макеты могут не только изменять макет, но и задействованные окна.

Вот как у меня настроен макет IDE Delphi 7, например:

enter image description here

Обратите внимание, что на этом снимке экрана редактор кода кажется тесным, поскольку я уменьшил его, чтобы минимизировать размер изображения для публикации в StackOverflow. На моем Mac этот макет прекрасно заполняет мой дисплей 2560x1440, предоставляя огромное количество места для кода и т. Д. :)

Несколько экземпляров

Ничего из этого не помогает в ситуации, когда на вашем дисплее одновременно отображаются два экземпляра IDE. Лучшее, что вы можете сделать в этой ситуации, - это разработать закрепленный макет, который объединяет как можно больше окон IDE, чтобы свести к минимуму возможность путаницы.

Однако этот подход явно не работает, когда речь идет о свободно плавающих конструкторах форм , и все, что вы можете сделать в этом случае, - это внимательно следить за тем, какая среда IDE становится активной, когда вы сосредотачиваетесь на конкретном > Дизайнер форм .

<- ->
vitalik200888 ( 2009-06-16 10:49 ) [0]

у меня главная форма1. создал form4. хочу чтобыв она запускалась первая, и от туда запускать form1. как сделать.

<- ->
pest ( 2009-06-16 10:53 ) [1]

Project > Options > Forms > Main form

<- ->
Ega23 © ( 2009-06-16 10:53 ) [2]


> у меня главная форма1. создал form4. хочу чтобыв она запускалась
> первая, и от туда запускать form1. как сделать.

в .dpr порядок нужный выставить.

<- ->
Ega23 © ( 2009-06-16 10:54 ) [3]


> Project > Options > Forms > Main form

Совершенно не обязательно, зависит от настроек.

<- ->
vitalik200888 ( 2009-06-16 11:06 ) [6]

прописываю в Form 4 : Form4.Hide;Form1.Show;
не принимает Form1.Show;почему.

<- ->
brother © ( 2009-06-16 11:12 ) [7]

> Form4.Hide;Form1.Show;

а наоборот?

<- ->
Игорь Шевченко © ( 2009-06-16 11:18 ) [8]

а что в dpr написано ? главная форма - это то, что первым создается по Application.CreateForm

Смотреть Demos\Db\MastApp

<- ->
vitalik200888 ( 2009-06-16 11:19 ) [9]

[Фатальная Ошибка] Project1.dpr(8): Could not compile used unit "Unit4.pas"

uses
Forms,
Unit1 in "Unit1.pas" ,
Unit2 in "Unit2.pas" ,
Unit3 in "Unit3.pas" ,
Unit4 in "Unit4.pas" ;

"от туда" - это принципиально ?

Можно ведь и "не от туда")

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, ComCtrls, ExtCtrls, DBCtrls, XPMan, Menus, Grids,
DBGrids, DB, StdCtrls, Mask, ToolWin,Unit2, ExtDlgs,Unit3,Jpeg, DBTables;

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
About1: TMenuItem;
XPManifest1: TXPManifest;
PageControl1: TPageControl;
ToolBar1: TToolBar;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ImageList1: TImageList;
OpenPictureDialog1: TOpenPictureDialog;
N10: TMenuItem;
N11: TMenuItem;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
DBNavigator1: TDBNavigator;
DataSource1: TDataSource;
Query2: TQuery;
Table2: TTable;
Label19: TLabel;
TabSheet1: TTabSheet;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label13: TLabel;
Label16: TLabel;
Label8: TLabel;
DBEdit1: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
DBEdit6: TDBEdit;
DBEdit8: TDBEdit;
DBEdit13: TDBEdit;
GroupBox1: TGroupBox;
DBMemo1: TDBMemo;
DBEdit7: TDBEdit;
DBEdit14: TDBEdit;
DBEdit5: TDBEdit;
DBEdit2: TDBEdit;
procedure N8Click(Sender: TObject);
procedure About1Click(Sender: TObject);

procedure N6Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N11Click(Sender: TObject);

procedure FormActivate(Sender: TObject);
procedure ToolButton8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

Подписаться на RSS рассылку

Чтоб регулировать прозрачность формы, нужно установить ей свойство AlphaBlend в True и изменять свойство AlphaBlendValue , значение последнего от 0 (форма полностью прозрачна и невидима) до 255 (форма абсолютно непрозрачна).

Выложите на форму TTimer . Установите ему свойство Interval в 10. Затем объявляем глобальную переменную Value

Теперь прописываем событие OnCreate формы.

И теперь прописываем обработчик таймера OnTimer

При запуске будет наблюдаться плавное появление формы.

0 Спам
( 07.11.2011 )

0 Спам
( 17.07.2011 )

0 Спам
( 11.07.2011 )

0 Спам
( 14.03.2010 )

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Form1.AlphaBlendValue<>255 then Form1.AlphaBlendValue:=Form1.AlphaBlendValue+1
else Timer1.Enabled:=false;
end;

Имхо чище, и меньше кода, а вот код на плавное исчезание программы после закрытия:

AnimateWindow(Handle, 1000, AW_HIDE or AW_BLEND);

0 Спам
( 23.11.2009 )

Ответ: Ничего не исчезнет! Все нормально. Value это переменная, а прозрачность формы. Единственное Value:=0 не нужно.

0 Спам
( 19.11.2009 )

0 Спам
( 18.11.2009 )

поправочки:
1) форма будет полность невидима и прозрачна при значении AlphaBlendvalue = 1, а при значении 0 она будет ещё и неосязаема.
2) если написать как в процедуре по тпймеру, то форма действительно плавно появится, но потои совсем исчезнет

Copyright © 2008 - 2018 Программирование на Delphi для начинающих и не только.

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.

Очень часто, нам необходимо расширить какую-то возможность определенного компонента. Я уже не раз встречался с такой проблемой. Самым правильным способом будет создание нового компонента потомка, в котором нужно реализовать необходимые действия. Правильно, но не всегда эффективно. Сегодня мы научимся использовать компоненты не совсем так, как задумывал дядя Борман.

Но иногда можно и даже возникает необходимость отступить от этого правила. Например, у вас в проекте используется 100 кнопок TButton, и вдруг мы захотели наделить эти кнопки новым одинаковым свойством. Если следовать классическому методу решения проблемы, то необходимо будет сначала создать новый компонент, а потом поступить одним из двух способов:

1. Вручную изменить в dfm и pas файле предка для каждого компонента. Когда их 100 штук, процесс изменения может затянуться и будет очень утомительным;

2. Заново создать все кнопки. Старые нужно удалить и создать новые кнопки от нового компонента. Этот процесс будет проходить еще дольше, особенно если ты не используешь действия (TAction) и придется восстанавливать каждое свойство и обработчик события для кнопки.

Намного проще изменить стандартный компонент TButton и больше никаких изменений в проекте делать не надо. Для этого есть два варианта – глобальное изменение и локальное. В любом случае, изменения производятся одинаково, разница только в том, как сделать так, чтобы Delphi компилировал наш вариант нового компонента.

Изменим стандартный компонент

У нас есть возможность изменения стандартных компонентов благодаря тому, что все исходные коды компонентов входят в поставку Delphi. Самое странное, что исходных кодов я не нашел в Delphi 2005. Возможно, это связано с тем, что у меня бета версия и в полной версии исходные коды будут, потому что они действительно необходимы.

В Delphi 7 исходные коды VCL компонентов находятся в директории Delphi7/Sources/Vcl. В последнее время все большую популярность получает Delphi 2005. Тут с исходными кодами напряг :(, Borland явно пожадничал.

Объявление кнопки TButton находится в модуле StdCtrls.pas. Давайте откроем этот файл и отредактируем объект TButton. Я специально выбрал именно этот объект, потому что с ним будет проблем выше крыши при локальном компилировании :).

Итак, найдите описание компонента TButton и добавьте в раздел public новую процедуру:

Компилируй правильно

Теперь необходимо, чтобы при компиляции Delphi использовал модифицированную версию файла. Сначала рассмотрим глобальный метод. Выбери меню Tools/Environment Options. Перед нами откроется окно настроек Delphi. Переходим на закладку Library. Здесь в строке Library path показаны пути, где компилятор должен искать модули. Щелкни по кнопке с тремя точками, чтобы было удобнее смотреть и редактировать список путей в специальном окне.


Свойства проекта, закладка Library


Окно настройки директорий для поиска модулей

Обрати внимание на первую строку в окне, где находиться путь $(DELPHI)\Lib. Первым делом компилятор будет искать модули в директории \lib, в директории, где установлен Delphi. Если нужный dcu или pas файл в этой директории не найден, то будут просматриваться остальные директории в списке. Понятно, к чему я клоню? Если нет, читаем дальше, а дальше будет интереснее.

Наша задача добавить путь к директории с исходными кодами VCL модулей и поставить этот путь первым, чтобы компилятор использовал эту директорию. Для этого выполняем следующие действия:

1. В строку ввода под списком директорий введи путь $(DELPHI)\Source\Vcl;

2. Нажми кнопку Add, чтобы добавить путь;

3. Выдели только что добавленный путь, и стрелкой вверх переместите его на первую строчку;

4. Сохраняем изменения, нажатиям кнопки ОК.

Теперь можно компилировать проект.

Локальная компиляция

Для локального подключения файла StdCtrls.pas, его необходимо скопировать в ту же директорию, где ты хранишь исходный код проекта. В этом случае, в настройках Delphi ничего изменять не надо, потому что директория проекта всегда проверяется первой. Найдя в ней файл StdCtrls.pas, директория \lib проверяться не будет, поэтому компилятор использует модифицированную версию компонента TButton.

Попробуйте выполнить локальную компиляцию. Вот тут возникают проблемы. Сначала компилятор укажет на модуль Themes и скажет, что модуль Dialogs скомпилирован с другой версией TButton. В данном случае проблема решается просто. Посмотрите, модуль Themes подключен в uses раздела implementation. Если перенести подключение в uses раздела interface (в начале модуля), то ошибка исчезнет. Такой трюк работает не всегда и скорее исключение из правил. Ниже мы увидим более надежный вариант решения этой проблемы.

  • Берется из директории \lib;
  • Использует модуль stdctrls;
  • - Скомпилирован с другой версией TButton.

Два разных компонента с одним и тем же именем не могут существовать в одном проекте. Трюк, который мы провели с модулем Themes уже не пройдет. Тут нужно другое решение. А оно лежит на самой поверхности – перекомпилировать и модуль ExtCtrls. Для этого его тоже скопируйте в директорию с исходным кодом проекта. Теперь этот модуль перекомпилируется, и тоже будет использовать модифицированный TButton.

Чтобы не было больше проблем с компиляцией, скопируйте в директорию с исходным кодом проекта файлы Dialogs.pas и Buttons.pas.

Вот таким не хитрым способом, несколько лет назад я решил одну очень большую проблему. В одной из версий Delphi (точно не помню, но кажется это был Delphi 4) в сетке StringGrid один метод работал не совсем так, как мне надо было. Я модифицировал его и подключил к программе локально.

Используй лучше локальное подключение, потому что нет гарантии, что модифицированная версия компонента понадобится во всех остальных проектах. Да и компилировать все стандартные модули из исходных кодов нет смысла, когда уже есть скомпилированные версии в директории \lib.

Использование закрытых методов

Я уже не раз замечал, что разработчики Delphi иногда прячут в области private или protected очень полезные возможности компонентов. Я понимаю, что они запрещают доступ к тем свойствам и методам, неверное обращение с которыми может привести к краху программы. И все же, иногда доступ к запретному плоду просто необходим.

Как получить доступ к переменной или методу, который закрыт? Рассмотрим проблему на примере кнопки. У компонента TButton есть закрытый метод SetButtonStyle. Этот метод объявлен в секции protected. Как обмануть Delphi и получить доступ к этому методу напрямую? Если написать в программе следующий код, то во время компиляции произойдет ошибка:

У компилятора Delphi есть один недостаток (а может быть преимущество, сказать трудно). Если два объекта объявлены в одном модуле, то все их свойства и методы будут доступны друг другу. При этом не имеет значения, где объявлены эти методы и свойства, открыты они или закрыты. Такие объекты называются дружественными и чисто по братски делятся всеми своими возможностями.

Но этого мало, ведь кнопка и наш проект объявлены в разных модулях, поэтому возможность на первый взгляд бесполезная. Не торопитесь. У объектно-ориентированного программирования есть очень полезное свойство – наследование. При этом потомку может быть назначен любой предок, и код будет работать верно.

Стань другом

Давайте объединим эти две возможности и получим доступ к закрытому методу. Итак, в модуле нашей формы объявляем новый класс, который будет происходить от TButton. Объявление будет следующим (оно должно быть в разделе type):

Теперь, если в любом месте этого модуля можно использовать закрытые методы кнопки. Допустим, что у нас на форме есть кнопка Button1 типа TButton. Этот объект является предком для TMyButton, поэтому запись TMyButton(Button1) является вполне корректной. А так как класс TMyButton объявлен в этом же модуле, то мы легко можем получить доступ к его закрытым методам и свойствам. Для этого достаточно написать код:

Получается, что когда мы объявили наследника от кнопки, все его методы переместились в наш модуль. А так как в одном модуле классы являются дружественными и видят все закрытые свойства и методы, то мы с легкостью смогли их прочитать.

Этот метод хорош, только если вам нужно свойство или метод из раздела protected. Все, что объявлено в разделе private не доступно потомкам, а значит, не переносится в наш модуль.

Сетка DBGrid

Очень часто меня спрашивают, как можно изменить высоту определенной колонки в компоненте TDBGrid. Да, у этого компонента нет свойства, которое отвечало бы за высоту, но среди предков TDBGrid есть объект TCustomGrid, у которого есть свойство RowHeights. Чтобы его использовать, достаточно написать следующую строку:

Но тут хочется предупредить, что Borland не зря закрыло это свойство. Дело в том, что если пролистать сетку DBGrid, то возникнут серьезные проблемы с прорисовкой. В некоторых случаях закрытые свойства и методы предка действительно могут спасти, но могут и нарушить работу программы. В данном случае, мы достаточно просто изменили высоту строки, но теперь придется попотеть, чтобы данные отображались правильно.


Сетка DBGrid, в которой строки имеют разную высоту

Compile Complete

Как видишь, далеко не всегда нужно создавать нового потомка, чтобы наделить компонент новыми возможностями. Можно использовать стандартную реализацию, просто расширяя возможности.

Использование закрытых свойств и методов компонентов должно быть аккуратным. Разработчики Borland не зря закрывают методы, ведь прямой вызов некоторых из них может привести к серьезным проблемам в работе всей программы. Закрытые методы и свойства не документируются в файле помощи, поэтому сложно понять, как они используются. Но если проанализировать исходный код модуля, то можно легко понять, что, когда и как использовать.

Помни, хакерство – это образ мышления, образ жизни и постоянные исследования. Удачи в твоих дальнейших исследованиях.

Исходник Нннннада?

Тут есть еще и исходник, который можно скачать, просто кликни здесь

Поделитесь с друзьями

Внимание. Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание

Читайте также: