Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Simon75 - Novembre 18, 2013, 05:18:48 pm

Titolo: Form modale
Inserito da: Simon75 - Novembre 18, 2013, 05:18:48 pm
Salve a tutti,  vorrei sapere come si rende una form modale.

Attualmente la quando clicco fuori dalla form la finestra di dialogo finisce sotto, vorrei evitare questo.

Avete qualche esempio?

Saluti
Titolo: Re:Form modale
Inserito da: Stilgar - Novembre 18, 2013, 05:23:37 pm
Codice: [Seleziona]
xxx.showModal;
Titolo: Re:Form modale
Inserito da: xinyiman - Novembre 18, 2013, 06:31:19 pm
Il buon Stilgar ha già detto tutto :)
Titolo: Re:Form modale
Inserito da: Simon75 - Novembre 19, 2013, 12:03:05 pm
Grazie,

Ma vorrei capire se le TOpenDialog e le TSaveDialog sono Modali.

Sinceramente non riesco a renderle modali.

Ciao

Codice: [Seleziona]


function ApriSaveDialog: ShortString;
  var
    Dlg: TFileDialog;

  begin
    Result := '';
    Dlg := TSaveDialog.Create(nil);
    try
      Dlg.DefaultExt := 'txt';
      Dlg.Filter := '*.txt';
      if Dlg.Execute then
        Result := Dlg.FileName
      else
        Result := '';
    finally

      FreeAndNil(Dlg);
    end;
  end;

  function ApriOpenDialog: ShortString;
  var
    Dlg: TFileDialog;

  begin
    Result := '';
    Dlg := TOpenDialog.Create(nil);
    try
      Dlg.DefaultExt := 'txt';
      Dlg.Filter := '*.txt';
      if Dlg.Execute then
        Result := Dlg.FileName
      else
        Result := '';
    finally

      FreeAndNil(Dlg);
    end;
  end;       

Titolo: Re:Form modale
Inserito da: nomorelogic - Novembre 19, 2013, 05:16:50 pm
TOpenDialog e TSaveDialog sono modali.
Vuol dire che finché non hai chiuso quel dialogo l'applicazione principale è in stand-by e non puoi neanche accedere alle sue altre finestre.

Che comportamento vorresti ottenere che invece non hai?
Titolo: Re:Form modale
Inserito da: Simon75 - Novembre 19, 2013, 09:34:02 pm
Vorrei ottenere il comportamento che hai menzionato te, invece non avviene e quando clicco fuori dalla finestra di dialogo che sia Topen o Tsalva la finestra di dialogo si nasconde sotto il programma in uso e vorrei evitare questo.

Titolo: Re:Form modale
Inserito da: Stilgar - Novembre 19, 2013, 10:28:13 pm
Per essere modale, una qualsiasi finestra, deve sapere chi è l'applicazione che la sta eseguendo.
Codice: [Seleziona]
Dlg := TOpenDialog.Create(nil);
Gli stai togliendo la possibilità di diventare modale se metti un nil come "owner". Non riesce a risalire all'applicazione in questa maniera.
Devi trovare il modo di ottenere quella che in c++ viene passato come hInstance al winmain.
Poi procediamo con gli altri passi.
ps: essendo una dll quella che stai creando tu (vado a memoria) la cosa diventa un attimino più ingarbugliata, ma cerca nella documentazione.

Stilgar
Titolo: Re:Form modale
Inserito da: Simon75 - Novembre 20, 2013, 01:58:24 pm
Sulla documentazione non è spiegato niente, ho contattato via email il produttore del software mi ha detto di togliere 
Codice: [Seleziona]
 dlg.execute()
  e mettere al suo posto
Codice: [Seleziona]
dlg.showModal() 
  Mi ha scritto che non è sicuro ma di provare, andiamo bene :)

Ma l'errore che indica è:  itel.lpr(97,14) Error: identifier idents no member "showModal"

Titolo: Re:Form modale
Inserito da: Stilgar - Novembre 20, 2013, 02:15:01 pm
Dialog non ha showModal.
E' un wrapper alle "classi" windows.
Ha solo il metodo execute che può tornarti utile.

Hai cercato come lavorare con la DLLProc ?

Stilgar
Titolo: Re:Form modale
Inserito da: Stilgar - Novembre 20, 2013, 02:54:59 pm
Allora, ho fatto una piccola indagine.
DLLProc su FreePascal è un casino.
C'è parecchia gente che si lamenta nel porting da Delphi a Lazarus.

Cambiamo approccio.
Codice: [Seleziona]
library project1;

{$mode objfpc}{$H+}

uses
  Classes,
  Windows,
  Forms, Interfaces, InterfaceBase, FormProva;

var
  HInstance : THANDLE;
begin
  HInstance:=  GetModuleHandle(nil);
  WidgetSet.AppHandle:= HInstance;
  Application.Initialize;
  Application.CreateForm(TForm1,Form1);
  Form1.ShowModal;
end.     
Prova a vedere se questo codice di boostrap della dll può esserti d'aiuto.

Si basa sul fatto che "GetModuleHandle(nil)" resituisca l'handle dell'eseguibile e non della dll.

FormProva è una form a caso, se ne hai ...

Stilgar

EDIT :
bootstrap e non boostrap ;)

Stilgar
Titolo: Re:Form modale
Inserito da: Simon75 - Novembre 20, 2013, 05:29:08 pm
Dammi una mano a comporre il tutto :)
Titolo: Re:Form modale
Inserito da: Stilgar - Novembre 20, 2013, 06:51:03 pm
Do# Fa La Sol#
Va bene?