MDIChild form saklama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

MDIChild form saklama

Mesaj gönderen hicker »

dxGridHook ile mdichild formların kaydedilememesinin sebebi nedir acaba?

Kod: Tümünü seç

       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.

Kod: Tümünü seç

             AColumn.Visible := ReadBool(APathCol, 'Visible', AColumn.Visible);
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?
hicker
Üye
Mesajlar: 68
Kayıt: 01 Tem 2003 09:58
Konum: Konya

Mesaj gönderen hicker »

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...

Kod: Tümünü seç

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)
...
fahri
Üye
Mesajlar: 5
Kayıt: 18 Haz 2003 08:59

Mesaj gönderen fahri »

Aşağıdaki kodlar çalışıyor.


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;
Cevapla