Toon posts:

[Delphi] GetOpenFileName probleem

Pagina: 1
Acties:
  • 267 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil graag in Delphi 6 (Personal Edition) een OpenDialogBox weergeven zonder het standaard OpenDialog component te gebruiken.
In de MSSDK help heb ik gevonden dat dat mogelijk is met de functie "GetOpenFileName(Ofn:tagOfnA)".
Het type "tagOfnA" is gelijk aan het type "TOpenFileName" in Delphi.
De functie heb ik geprobeerd in Delphi 6, maar geen opendialog wordt weergegeven......

Kan iemand me hiermee misschien helpen????????????

Ik heb in Delphi de volgende code gebruikt:

var Ofn:TOpenFileName;

procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(Ofn,SizeOf(TOpenFileName),0);
Ofn.lStructSize:=SizeOf(TOpenFileName);
Ofn.hWndOwner:=0;
Ofn.lpstrFile:='';
Ofn.nMaxFile:=0;
Ofn.lpstrFilter:='All\0*.*\0Text\0*.TXT\0';
Ofn.nFilterIndex:=1;
Ofn.lpstrFileTitle:=nil;
Ofn.nMaxFileTitle:=0;
Ofn.lpstrInitialDir:=nil;
Ofn.Flags:=OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
GetOpenFileName(Ofn);
end;

Thanx :)

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

heb het niet uitgeprobeert, maar ik heb stiekem het idee dat je dan ook het standaard opendialog voorgeschoteld krijgt

www.fendt.com | Nikon D7100 | PS5


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Moet je Ofn niet eerste Create-en? (en Free-en!)

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Op maandag 14 januari 2002 20:39 schreef El_Mundo het volgende:
Moet je Ofn niet eerste Create-en? (en Free-en!)
"Ofn" is geen object, maar een record variabele die je moet doorgeven aan windows :)

==> misschien dat iemand de code eens in Delphi wil zetten en eens kijken of het op een andere computer wel werkt???????????????????? dan weet ik of het aan mijn pc en Delphi ligt :)

Verwijderd

Zoek de verschillen :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Button1Click(Sender: TObject);
var
  Ofn: TOpenFileName;
  TempFilename: string;
begin
  FillChar(Ofn, SizeOf(TOpenFileName), 0);
  with Ofn do
  begin
    lStructSize := SizeOf(TOpenFileName);
    hWndOwner := SysInit.HInstance;
    SetLength(TempFilename, MAX_PATH + 2);
    lpstrFile := PChar(TempFilename);
    FillChar(lpstrFile^, MAX_PATH + 2, 0);
    nMaxFile := MAX_PATH;
    lpstrFilter := 'All'#0'*.*'#0'Text'#0'*.TXT'#0;
    nFilterIndex := 1;
    lpstrFileTitle := nil;
    nMaxFileTitle := 0;
    lpstrInitialDir := nil;
    Flags := OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
  end;
  GetOpenFileName(Ofn);
end;

En je krijgt hetzelfde scherm te zien als met het component, alleen werkt het component beter, makkerlijker, sneller etc...
edit:

Oepsie :)

Verwijderd

Topicstarter
Ik heb net de bovenstaande code ff in Delphi gekopieerd en gecompiled, maarre ie doet nog altijd niets als ik op button1 click.................... :'(

But thanx 4 the reply :)

Verwijderd

Mmm, typisch, bij mij doet hij het wel, maar ik heb dan ook Delphi5...

En doet het component het wel bij jou?

Zal misschien het verschil zijn tussen D5 <> D6. Kopieer anders de source van het component en strip al het overbodige weg...; of zoek 's op GetOpenFileName in de pas files van de source dir van delphi.

Probeer anders dit 's:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function GOT_GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall;
  external 'comdlg32.dll' name 'GetOpenFileNameA';

procedure TForm1.Button1Click(Sender: TObject);
var
  Ofn: TOpenFileName;
  TempFilename: string;
begin
  FillChar(Ofn, SizeOf(TOpenFileName), 0);
  with Ofn do
  begin
    lStructSize := SizeOf(TOpenFileName);
    hWndOwner := 0; //Handle; //SysInit.HInstance;
    SetLength(TempFilename, MAX_PATH + 2);
    lpstrFile := PChar(TempFilename);
    FillChar(lpstrFile^, MAX_PATH + 2, 0);
    nMaxFile := 0;
    lpstrFilter := 'All'#0'*.*'#0'Text'#0'*.TXT'#0;
    nFilterIndex := 1;
    lpstrFileTitle := nil;
    nMaxFileTitle := 0;
    lpstrInitialDir := nil;
    Flags := OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
  end;
  GOT_GetOpenFileName(Ofn);
end;

Verwijderd

Topicstarter
Het progje doet 't nog steeds niet.......... :?
Het zal denk ik wel aan Delphi 6 liggen.... of misschien ligt het aan mijn OS, dat is Windows XP?????????? (Misschien vanwege backward compatiblity of zoiets......)

Als ik met de functie "CommDlgExtendedError" de error code opvraag, dan krijg ik de error "CDERR_INITIALIZATION".

Het standaard component werkt trouwens perfect zoals het moet.

Maar dat kan ik helaas niet gebruiken in het progje waar de OpenDialogBox ook voor bedoeld is. Ik ben bezig met een freeware cpu/memory/pagefile progje (zie www.beam.to/mco), geschreven in Delphi in win32 API, daar wil ik een OpenDialog aan toe voegen.

Thanx :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Ik heb het net in Delphi 6 + XP getest en hier werkte het ook niet. Er stond iets in de help over een bepaalde hook, weet niet of dat er iets mee te maken had. Weet er ook niet zoveel van....

oogjes open, snaveltjes dicht


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Mag ik vragen waarom je niet gewoon de standaard OpenDialog gebruikt?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Topicstarter
Op maandag 14 januari 2002 23:21 schreef jelmervos het volgende:
Mag ik vragen waarom je niet gewoon de standaard OpenDialog gebruikt?
Zie mijn vorig aangepaste bericht...... :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Op maandag 14 januari 2002 23:17 schreef TSI2002 het volgende:
Het progje doet 't nog steeds niet.......... :?
Het zal denk ik wel aan Delphi 6 liggen.... of misschien ligt het aan mijn OS, dat is Windows XP?????????? (Misschien vanwege backward compatiblity of zoiets......)

Als ik met de functie "CommDlgExtendedError" de error code opvraag, dan krijg ik de error "CDERR_INITIALIZATION".

Het standaard component werkt trouwens perfect zoals het moet.

Maar dat kan ik helaas niet gebruiken in het progje waar de OpenDialogBox ook voor bedoeld is. Ik ben bezig met een freeware cpu/memory/pagefile progje (zie www.beam.to/mco), geschreven in Delphi in win32 API, daar wil ik een OpenDialog aan toe voegen.

Thanx :)
Maar gebruikt dat componentje niet de zelfde dll als de api?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Op maandag 14 januari 2002 23:26 schreef El_Mundo het volgende:

[..]

Maar gebruikt dat componentje niet de zelfde dll als de api?
Zover ik begrepen heb is het TOpenDialog object nog altijd een class van TComponent, dus zonder een TForm object als parent kun je 't niet gebruiken...... ook al gebruiken ze beiden uiteindelijk dezelfde dll (CommDlg32.dll) van windows...... :)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

En.....?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Op maandag 14 januari 2002 23:32 schreef El_Mundo het volgende:
En.....?
Als ik het TOpenDialog component wil gebruiken dan moet ik bij het maken van het object het volgende doen:

var AOwner:TComponent;
OpenDialog:TOpenDialog;

OpenDialog:=TOpenDialog.Create(AOwner);

en...... ik heb dan geen owner (AOwner variabele):
het window (de "form" als het ware) is gemaakt met de functie "CreateWindowEx", dus het enige wat ik heb is een Handle van het Window, en geen TComponent (oftwel een TForm) object...... :) Als ik het goed heb...... :)

Verwijderd

Op maandag 14 januari 2002 23:31 schreef TSI2002 het volgende:
Zover ik begrepen heb is het TOpenDialog object nog altijd een class van TComponent, dus zonder een TForm object als parent kun je 't niet gebruiken...... ook al gebruiken ze beiden uiteindelijk dezelfde dll (CommDlg32.dll) van windows...... :)
Je haalt TControl en TComponent door elkaar. TOpenDialog is gewoon een component dat je ff kunt creeeren en daarna weer kunt destroyen. Maakt niet uit wat de owner is [van mijn part nil]. TOpenDialog op zich is ook geen visueel component, eigenlijk alleen maar een wrapper om GetOpenFileName :)

Verwijderd

Topicstarter
Mijn bedoeling met 't progje is ook om het geheugen gebruik zo klein mogelijk te houden (omdat het progje, naast de cpu-load en pagefile gebruik, het geheugen gebruik bijhoudt).
Als ik dan een TOpenDialog object gebruik, zal het geheugen gebruik dan significant meer zijn?????????????

N.B. de exe is 55k, maar XP zegt dat ie nog altijd 2.1 MB geheugen snoept (waarom snap ik nog steeds niet....)
En...... ik vrees dat als ik de unit Dialogs gebruik, de exe er groot wordt.... (en dat is juist net een van de dingen die ik wil voorkomen.......)

Thanx :)

Verwijderd

Ik denk dat een standaard Delphi app zoveel geheugen reserveert om in te werken. Toevoegen van nieuwe componenten op een form zou dan een app geven die niet veel meer geheugen gebruikt [denk ik]

Maar hoe meet je die waarden, heb je verschillende methodes gebruikt? En kijk ook 's naar andere programma's, hoeveel gebruiken die?

Je zou kunnen kijken naar een vervanging voor de VCL bv hier. Maar waarschijnlijk geeft dat alleen een kleinere exe...

Verwijderd

Topicstarter
Het progje is vanaf de bodem geschreven in win32 API. Ik heb hiervoor een tutorial van C++ genomen en deze vertaald in Delphi (omdat ik Delphi,Pascal beter begrijp dan C++).

Mijn eerste opzet is om het resources (CPU, geheugen) gebruik van dit progje zo laag mogelijk te houden (omdat het progje een meting verricht probeer ik de invloed van het progje zelf zo laag mogelijk te houden). Functionaliteit staat dan ook boven alles. Natuurlijk is het zo dat zo'n progje altijd in beeld is, en het ook wel "leuk" is als ie er goed uitziet, daar is dan ook de nodige aandacht aan besteedt.
Daarom laad ik een (indien gewenst) bitmap van 211x98 32-bit in als achtergrond. Ook gebruik ik een offscreen bitmap waar ik de boel op teken en BitBlt deze dan naar de DeviceContext van het Window. Deze beide bitmaps gebruiken bij elkaar niet meer dan 165k geheugen. Dat is ook waarom ik het zo raar vind dat windows aangeeft dat het progje +2.1 MB geheugen gebruikt (misschien dat het te maken heeft met het static aanroepen van dll's........)

Het geheugen gebruik heb ik afgeleid uit de Windows Task Manager.

Ik vind het wel raar dat Delphi 6 gek doet over de "GetOpenFileName" functie......
In het verleden heb ik gewerkt met Delphi 3 en daar heb ik ook wel eens de functie "GetOpenFileName" gebruikt, daar deed ie het op de bovenstaande (1e post) wijze goed. Er is wel een verschil in de record opmaak van TOpenFileName. In

Delphi 6 zijn is er het volgende aan toegevoegd:
pvReserved:Pointer
dwReserved:Cardinal
FlagsEx:Cardinal

Ik heb ook zo'n vermoeden dat uiteindelijk daar misschien de fout zit....... (misschien heeft Borland wel ergens een foutje dat kan ook, maar dat lijkt me niet zo waarschijnlijk.......)

Thanx :)

Verwijderd

Ik bedoelde eigenlijk: hoe meet je hoeveel geheugen je app gebruikt? De Windows Task Manager is daar niet echt betrouwbaar in, is meer een maximale waarde volgens mij. Daarbij kan een programma geheugen claimen [maar nog niet gebruiken] als er genoeg geheugen vrij is.

Op google zag ik het volgende voorbij komen:
code:
1
SetProcessWorkingSetSize(GetCurrentProcess, LongWord(-1), LongWord(-1));
MSDN:
The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault. The size of the working set of a process is specified in bytes. The minimum and maximum working set sizes affect the virtual memory paging behavior of a process.
[..]
If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value -1, the function temporarily trims the working set of the specified process to zero. This essentially swaps the process out of physical RAM memory.
Moet je maar 's proberen.

Hier staat nog een vb prog.

Verwijderd

Topicstarter
Thanx 4 the help!
Nu heb ik een beter idee van het geheugen gebruik van het progje...... :)

Ik heb eens gezocht in de Delphi 6 source files voor het TOpenDialog object, maarre, helaas wordt bij Delphi 6 Personal Edition alleen van de Windows units de sources gegeven........

Kan me misschien iemand (die Delphi 6 heeft) de source van TOpenDialog toesturen of posten?????????????????

Thanx :) :) :)

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
De source van die opendialog mag ik je niet geven (licenties, hij zit er niet voor niets er niet bij de personal edition), maar het is een beste lap.

De code van DiFool werkt bij mij onder delphi 6, maar dan wel met deze wijziging:
code:
1
    nMaxFile := MAX_PATH;

Dan weet 'ie ten minste dat die een filename kwijt kan :).

Totaal:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function GOT_GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall;
  external 'comdlg32.dll' name 'GetOpenFileNameA';

procedure TForm1.Button1Click(Sender: TObject);
var
  Ofn: TOpenFileName;
  TempFilename: string;
begin
  FillChar(Ofn, SizeOf(TOpenFileName), 0);
  with Ofn do
  begin
    lStructSize := SizeOf(TOpenFileName);
    hWndOwner := 0; //Handle; //SysInit.HInstance;
    SetLength(TempFilename, MAX_PATH + 2);
    lpstrFile := PChar(TempFilename);
    FillChar(lpstrFile^, MAX_PATH + 2, 0);
    nMaxFile := MAX_PATH;
    lpstrFilter := 'All'#0'*.*'#0'Text'#0'*.TXT'#0;
    nFilterIndex := 1;
    lpstrFileTitle := nil;
    nMaxFileTitle := 0;
    lpstrInitialDir := nil;
    Flags := OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST;
  end;
  GOT_GetOpenFileName(Ofn);
end;
Pagina: 1