![]() |
|
|
#1
|
|||
|
|||
|
Подскажите по вопросу.
Использую в проге фреймы. Не получается с одного фрейма обратиться к другому. Ну например поменять значение edit.text в первом фрейме, нажимая на кнопку во втором. |
|
#2
|
|||
|
|||
|
Тут надо смотреть как у тебя организовано создание этих фреймов.
Короче, код давай. |
|
#3
|
|||
|
|||
|
Код слизан с альфаскинов,
http://www.alphaskins.com/sfiles/demos/chatdemo.zip До этого даже не знал, что такое фреймы, всегда юзал формы, накатал нужный себе проект, изменив этот исходник, теперь не знаю, как быть... Закидайте тапками плиз! |
|
#4
|
|||
|
|||
|
Лень качать и разбираться. Просто выложи куски кода создания фреймов.
|
|
#5
|
|||
|
|||
|
Главная форма
Код:
***
public
procedure OpenFrame(FrameType: TacFrame; Animated: boolean);
***
procedure TMainForm.OpenFrame(FrameType: TacFrame; Animated: boolean);
var
OldFrame: TFrame;
begin
if not (FormData.CurrentMenuFrame is FrameType) then begin
OldFrame := FormData.CurrentMenuFrame;
if Animated and FormData.sSkinManager1.Effects.AllowAnimation then
PrepareForAnimation(sPanel3, atcRunup);
FormData.CurrentMenuFrame := FrameType.Create(Self);
FormData.CurrentMenuFrame.Align := {alTop;//}alClient;
FormData.CurrentMenuFrame.Parent := sPanel3;
FreeAndNil(OldFrame);
if Animated and FormData.sSkinManager1.Effects.AllowAnimation then
AnimShowControl(sPanel3, 50, 255, atcRunup);
end;
end;FormData Код:
unit UnitData;
interface
uses
SysUtils, Classes, Forms, ImgList, Controls,
acAlphaImageList, sSkinManager, sSpeedButton, acAlphaHints;
type
TacFrame = class of TFrame;
TFormData = class(TDataModule)
sSkinManager1: TsSkinManager;
sCharImageList1: TsCharImageList;
sAlphaImageList1: TsAlphaImageList;
sAlphaHints1: TsAlphaHints;
public
CurrentMenuFrame: TFrame;
CurrentMenuBtn: TsSpeedButton;
CurrentWorkFrame: TFrame;
CurrentWorkBtn: TsSpeedButton;
procedure OpenFrame(FrameType: TacFrame; SelectBtn: TsSpeedButton);
procedure PaintSelRect(Bmp: TBitmap);
end;
var
FormData: TFormData;
implementation
{$R *.dfm}
uses sConst, sCommonData, sGraphUtils, sPanel, sVCLUtils, MainUnit;
procedure TFormData.OpenFrame(FrameType: TacFrame; SelectBtn: TsSpeedButton);
var
OldFrame: TFrame;
begin
if (FrameType <> nil) and (CurrentWorkBtn <> SelectBtn) then begin
MainForm.sSplitView2.SideShadow.Mode := ssmInternal;
MainForm.PanelMain.SideShadow.Mode := ssmNone;
MainForm.PanelMain.SkinData.SkinSection := '';
if CurrentWorkBtn <> nil then
CurrentWorkBtn.SkinData.SkinSection := 'LBTN';
CurrentWorkBtn := SelectBtn;
CurrentWorkBtn.SkinData.SkinSection := 'SELBTN';
if not (FormData.CurrentWorkFrame is FrameType) then begin
OldFrame := FormData.CurrentWorkFrame;
if sSkinManager1.Effects.AllowAnimation then
PrepareForAnimation(MainForm.PanelContainer, atcRunup);
FormData.CurrentWorkFrame := FrameType.Create(Application);
FormData.CurrentWorkFrame.Align := alClient;
FormData.CurrentWorkFrame.Parent := MainForm.PanelContainer;
FreeAndNil(OldFrame);
if sSkinManager1.Effects.AllowAnimation then
AnimShowControl(MainForm.PanelContainer, 50, 255, atcRunup);
end;
end
else begin
if CurrentWorkBtn <> nil then begin
CurrentWorkBtn.SkinData.SkinSection := 'LBTN';
CurrentWorkBtn := nil;
end;
if FormData.CurrentWorkFrame <> nil then
FreeAndNil(FormData.CurrentWorkFrame);
MainForm.sSplitView2.SideShadow.Mode := ssmNone;
MainForm.PanelMain.SideShadow.Mode := ssmInternal;
MainForm.PanelMain.SkinData.SkinSection := 'TRANSPARENT';
end;
end;
Открытие фрейма Код:
type
TFrameAccount = class(TFrame)
sSpeedButton1: TsSpeedButton;
procedure sSpeedButton1Click(Sender: TObject);
public
destructor Destroy; override;
end;
implementation
{$R *.dfm}
uses MainUnit, UnitData, UnitFrameEmpty, UnitFrameAccountEdit,
UnitFrameAccountCreate;
destructor TFrameAccount.Destroy;
begin
FormData.CurrentWorkBtn := nil;
inherited;
end;
procedure TFrameAccount.sSpeedButton1Click(Sender: TObject);
begin
FormData.OpenFrame(TFrameAccountCreate, TsSpeedButton(Sender));
end;
end. |
|
#6
|
|||
|
|||
|
Ну, у тебя, вроде, сохраняется указатель на фрейм (FormData.CurrentMenuFrame). Вот через него и обращайся. Только надо еще откаститься к нужному классу фрейма. Например:
Код:
if FormData.CurrentMenuFrame Is TFrameWithEdit Then (FormData.CurrentMenuFrame As TFrameWithEdit).Edit1.Text := 'aaa'; |
|
#7
|
|||
|
|||
|
lmikle странно, но значения не передаются все равно!
|
|
#8
|
|||
|
|||
|
Ну, значит не того типа фрейм. Пройди построчно в дебаггере, посмотри что у тебя там в переменных.
|