Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизВопрос по использованию Frame Найти похожие ветки
← →
Abcdef123 (2007-07-23 07:06) [0]Здравствуйте, Мастера. Я прочла хелп по компоненту frame, создала 2 фрейма, положила их на одну форму и хочу, чтоб в зависимости от режима вызова этой формы, был виден и доступен только один из этих фреймов. Но, почему то у меня всегда видет один и тот же фрейм, тот, который в режиме разработки лежит сверху. Я даже принудительно пробовала BringToFront - не помогло. Что не так? Вот процедура определения, какой фрейм должен быть виден.
procedure TFRM_FilterType.ShowSelections;
begin
if RptType in [TRptServFilter] then
FRM_FilterType.FR_ServFilter.BringToFront;
if RptType in [TRptPlantFilter] then
FRM_FilterType.FR_PlantFilter.BringToFront;
FRM_FilterType.FR_ServFilter.Visible := (RptType in [TRptServFilter]);
FRM_FilterType.FR_ServFilter.Enabled := (RptType in [TRptServFilter]);
FRM_FilterType.FR_PlantFilter.Visible := (RptType in [TRptPlantFilter]);
FRM_FilterType.FR_PlantFilter.Enabled := (RptType in [TRptPlantFilter]);
end;
← →
Elen © (2007-07-23 07:58) [1]
> if RptType in [TRptServFilter] then
> if RptType in [TRptPlantFilter] then
Проверь эти условия. Может у тебя они оба срабатывают.
Кстати тут лучше написать так :
if RptType in [TRptServFilter] then
FRM_FilterType.FR_ServFilter.BringToFront
else
FRM_FilterType.FR_PlantFilter.BringToFront
← →
Abcdef123 (2007-07-23 12:39) [2]to Elen
1 Условие на тип RptType срабатывает нормально, то есть определяет какой [TRptServFilter] или [TRptPlantFilter] запущен на данный момент. И выполняет все строки правильно. Но потом, на форме всегда впереди один и тот де фрейм. Причем, конкретнее, если к примеру фрейм типа TRptPlantFilter физически делит сверху, то когда запускаем программу с типом TRptServFilter, то на выполнении TRptPlantFilter сверху, а фрейм TRptServFilter немного из-за него виден, так как он побольше размером. То есть получается, что команда visible := False не срабатывает физически на верхний фрейм.
1 Насчет предложения if ELSE на данном этапе можно, но в будущем я планировала бы еще другие фреймы использовать на этой же форме. И, поскольку я говорю, что все строки программы выполняются прявильно (я пошагово прошла проверила значения), то это предложение ничего не улучшит.
Может с фреймами надо как-то иначе работать?? Подскажите, что же не так?
← →
Elen © (2007-07-23 14:30) [3]
> Может с фреймами надо как-то иначе работать?? Подскажите,
> что же не так?
вот пример переключения по фреймам:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit4, Unit3, Unit2;
type
TForm1 = class(TForm)
Frame21: TFrame2;
Frame31: TFrame3;
Frame41: TFrame4;
RadioGroup1: TRadioGroup;
procedure RadioGroup1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
//****** CASE ******
case RadioGroup1.ItemIndex of
0:Frame21.BringToFront;
1:Frame31.BringToFront ;
else Frame41.BringToFront;
end;
//****** END CASE ****** {}
end;
end.
Ничего особенного.
Где-то в условии ты запуталась, скорее всего.
← →
Loginov Dmitry © (2007-07-24 00:35) [4]> FRM_FilterType.FR_ServFilter.Visible := (RptType in [TRptServFilter])
> ;
> FRM_FilterType.FR_ServFilter.Enabled := (RptType in [TRptServFilter])
> ;
> FRM_FilterType.FR_PlantFilter.Visible := (RptType in [TRptPlantFilter])
> ;
> FRM_FilterType.FR_PlantFilter.Enabled := (RptType in [TRptPlantFilter])
> ;
К чему относится переменная FRM_FilterType?
Убери обращение к ней из процедуры TFRM_FilterType.ShowSelections.
← →
Abcdef123 (2007-07-24 05:06) [5]To Loginov Dmitry:
Спасибо, большое - помогло!!! :-) Сейчас показывает правильно фреймы.
Правда сама идея использовать фреймы не прошла у меня. :-( Компоненты (TEdit), которые я положила на фреймы я планировала использоавать как параметры xml файла, но, обработчик xml не видит эти элементы, пытается искать только на самой форме FRM_FilterType, а то ято на этой форме еще есть фреймы обработчик не рассматривает. Я думала, что фреймы рассматриваются типично панелям формы, а оказалось нет :-(
Или все же должны вести себя как панели, может просто у меня опять не там ошибка?
Заранее должна оговориться, что программа-обработчик xml файлов написана не мной, и она используется для всех проектов нашей компании, так что я не имею права менять что-либо в этой программе.
Есть ли советы или пояснения насчет фреймов в этой проблемме?
← →
Leonid Troyanovsky © (2007-07-24 10:42) [6]
> Abcdef123 (24.07.07 05:06) [5]
> Или все же должны вести себя как панели, может просто у
> меня опять не там ошибка?
А обработчик видит лежащие на панели TEdit?
--
Regards, LVT.
← →
Abcdef123 (2007-07-24 11:34) [7]to Leonid Troyanovsky:
Если на форму положить панель вместо фрейма, и на ней разместить TEdit компоненты, то да - обработчик видит эти TEdit!
У нас в проекте все так и сделано, через панели, но я на новых разработках хочу использовать фреймы вместо панелей, так как модифицировать фрейм проще, чем на одной форме пытаться выйти на панель, которйю надо вдруг модифицировать.
Могу для полноты информации дать конкретно строку обратотчика, где выдает ошибку выполнения:
if repBuilder.InputForm.FindComponent(currentElement.nodeName) <> nil then
Я в пошаговом выполнении посмотрела, InputForm, где ищутся эти компоненты FRM_FilterType (та, что содержит фреймы). Начальник даже дал добро модифицировать обработчик (чтоб ничего старое не повредить, конечно), я вот думаю, как определить какой фрейм в этот момент надо рассматривать, то есть как прописать, какой фрейм активный на момент выполнения обработчика. Как это прописать?
← →
Плохиш © (2007-07-24 12:11) [8]
> Могу для полноты информации дать конкретно строку обратотчика,
> где выдает ошибку выполнения:
> if repBuilder.InputForm.FindComponent(currentElement.nodeName)
> <> nil then
FindComponent находит только те компоненты, родителем для которых является, в данном случае, repBuilder.InputForm. Для компонентов, лежащих на фрейме, родителем является фрейм, т.к. и компонентом, отвечающим за их отображение. Форма ничего не знает о них, т.ж. как и в общем случае ничего не знает о фрейме.
В Вашем случае надо, первое найти компонент отвечающий за отображение фрейма (ParentWindow), а за тем проверить является ли он дочерним для формы repBuilder.InputForm.
← →
Abcdef123 (2007-07-24 12:34) [9]to Плохиш:
Теоретически я это знаю, как практически это прописать вот не смогла пока. :-(
Тут вот ведь надо четко обработчику указать, какой из фреймов формы на данный момент надо обрабатывать. Могли бы вы пример привести, как прописать опреление ParentWindow и проверку на дочерность, плз?
← →
Плохиш © (2007-07-24 12:41) [10]
> Abcdef123 (24.07.07 12:34) [9]
Тут можно идти с двух сторон:
1. Проводить рекурсивный поиск фрейма в коллекции Controls формы и всех компонентов из Controls.
или
2. Просматривать список фраймов и проверять у них свойство ParentWindow и если оно не равно nil, то пытаться найти этот компонент в списке Components формы.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c