if TForm(AComponent).formStyle <> fsMDIChild then
SaveForm;
birinci satırdaki şartı kaldırınca mdichild formlar da kaydediliyor. ini dosyadan kontrol ettiğimde de bir sorun yok, kayıt doğru yapılmış. ancak form açılırken yükleme esnasında tüm değerler default atanan değerleriyle okunuyor.
APathCol ile verilen bölüm ini dosyada mevcut, 'Visible' başlığına karşılık değeri de 0 ancak okunan değer 1 yani AColumn.Visible ile verilen default değeri dönüyor. bunun sebebi ne olabilir ve üstesinden gelmenin bir yolu var mıdır?
deneme yanılma yoluyla bir çözüm buldum ama içime sindiğini söyleyemem. formlar açılıp kapanırken geçen windows mesajlarını kontrol edince tasarım aşamasında form stili fsMDIChild olan, ancak çalışma esnasında fsNormal olarak değiştirdiğim formların kapanışı esnasında WM_Destroy yerine WM_Activate mesajının geldiğini farkettim. MSDN'deki açıklamaya göre ve WM_Activate mesajının da isminden anlaşılabileceği gibi bu mesaj form aktif olduğunda ve aktivasyonu geçtiğinde gönderiliyor. ama programımdaki mesaj akışında bunun böyle olmadığını, WM_Activate mesajının sadece yukarıda bahsettiğim şartlara uyan formlar kapanırken geldiğini farkettim. infoCustomizeHook içerisinde aşağıdaki değişikliği yapınca sorunum çözüldü. Umarım çözüm doğrudur ve birilerinin işine yarar...
function infodxWndHookProc(Code: Integer; wParam: WParam; lParam: LParam): LRESULT stdcall;
var
AComponent: TComponent;
begin
try
if infoHook.Enabled then
with PCWPStruct(lParam)^ do
begin
AComponent := FindControl(HWnd);
if Message = WM_SHOWWINDOW then
if AComponent is TCustomForm then
if wParam = WSF_VISIBLE then
infoHook.LoadControlSettings(AComponent)
else
else
else if (Message = WM_DESTROY)or(Message = WM_ACTIVATE) then
if (AComponent is TCustomForm) then
infoHook.SaveControlSettings(AComponent)
...
Hide MDIChild form
One of the ways for MDIChild form hiding is WinAPI ShowWindow and SetWindowPos functions.
Hide1Click procedure hides the form and Show1Click procedure shows this form.
Don't forget to remove line
Application.CreateForm(TForm2, Form2) from project file and line
var Form2: TForm2 from unit2.pas file.
var
ChildForm: TForm;
...
procedure TForm1.New1Click(Sender: TObject);
begin
if not Assigned(ChildForm) then
begin
ChildForm:=TForm2.Create(Application);
ChildForm.Caption:='ChildForm';
end;
end;
procedure TForm1.Hide1Click(Sender: TObject);
begin
if Assigned(ChildForm) then
ShowWindow(ChildForm.Handle, SW_HIDE);
end;
procedure TForm1.Show1Click(Sender: TObject);
begin
if Assigned(ChildForm) then
SetWindowPos(ChildForm.Handle, HWND_TOP, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE or SWP_SHOWWINDOW);
end;