| Autor |
Beitrag |
bf109g.01
      
Beiträge: 84
|
Verfasst: Do 16.02.12 18:49
Hallo, baue gerade eine Konsolenanwendung. Diese schließt sich sofort, nachdem ich die folgende function aufgerufen habe...
Delphi-Quelltext 1: 2: 3: 4:
| function PfadAendern: string; begin SelectDirectory('Verzeichnis wählen.', 'Arbeitsplatz', Result); end; |
Als Result kommt nur "". Ein Dialog zum Auswählen eines Verzeichnisses erscheint nicht.
Kann mir jemand sagen warum?
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.02.12 18:54
Was steht denn nach dem Beenden des Programms in der Konsole? Du schreibst etwas von Exception, was steht denn da?
Bei mir funktioniert das jedenfalls problemlos so. Wie sieht denn der weitere Code aus? Was passiert beim Debuggen? ...
Nebenbei:
Einen Dialog in einer Konsolenanwendung? Bist du sicher, dass die Idee gut ist? 
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Do 16.02.12 19:08
Ich gehe auch nicht davon aus, dass auf der Konsolenebene fensterorientierte Dialoge möglich sind, da diese ja sich innerhalb der Windows-Ebene bewegen. Während die Konsole eine reine Text-Ebene ist, als Überbleibsel des alten MS-DOS. Oder liege ich da verkehrt?
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
bf109g.01 
      
Beiträge: 84
|
Verfasst: Do 16.02.12 20:10
jaenicke hat folgendes geschrieben : | | Was steht denn nach dem Beenden des Programms in der Konsole? Du schreibst etwas von Exception, was steht denn da? |
Die kann ich nicht lesen. Sie blitzt nur kurz auf, bevor das Fenster schließt. Da ReadLN nicht ausgeführt wird, bleibt das Fenster auch nicht erhalten.
jaenicke hat folgendes geschrieben : | Einen Dialog in einer Konsolenanwendung? Bist du sicher, dass die Idee gut ist?  |
Berechtigte Frage, denn die eingebundenen Elemente der Uses-Liste blähen das ganze derart auf, dass es fast schon wieder unsinnig ist... Ich mag die Konsole einfach...
jaenicke hat folgendes geschrieben : | | Wie sieht denn der weitere Code aus? |
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: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105:
| program Copy;
{$APPTYPE CONSOLE}
uses SysUtils, Windows, Dialogs, FileCtrl, ActiveX, ShlObj, ComObj;
const CSIDL_STARTUP = $0007; function PfadAendern: string; begin SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.', 'Arbeitsplatz', Result); end;
function CreateLink(const AFilename, ALNKFilename, ADescription: string) : Boolean; var psl : IShellLink; ppf : IPersistFile; wsz : PWideChar; begin result:=false; if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then begin psl.SetPath(PChar(AFilename)); psl.SetDescription(PChar(ADescription)); psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename))); if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then begin GetMem(wsz, MAX_PATH*2); try MultiByteToWideChar(CP_ACP, 0, PChar(ALNKFilename), -1, wsz, MAX_PATH); ppf.Save(wsz, true); result:=true; finally FreeMem(wsz, MAX_PATH*2); end; end; end; end;
function GetShellFolder(CSIDL: integer): string; var pidl : PItemIdList; FolderPath : string; SystemFolder : Integer; Malloc : IMalloc; begin Malloc := nil; FolderPath := ''; SHGetMalloc(Malloc); if Malloc = nil then begin Result := FolderPath; Exit; end; try SystemFolder := CSIDL; if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then begin SetLength(FolderPath, max_path); if SHGetPathFromIDList(pidl, PChar(FolderPath)) then begin SetLength(FolderPath, length(PChar(FolderPath))); end; end; Result := FolderPath; finally Malloc.Free(pidl); end; end;
procedure mach(Pname:string); var PathCreate: string; begin Pathcreate:=PfadAendern+'\'+PName; CreateDirectory(PChar(PathCreate),nil);
WriteLN('Directory created:');WriteLN(Pathcreate);
CreateLink(Pathcreate+'\'+PName+'.exe', GetShellFolder($0007)+'\'+Pname+'.exe.lnk', 'Testverknüpfung'); WriteLN(GetShellFolder($0007));
end;
begin mach('Test'); write('test');
ReadLN; end. |
Tranx hat folgendes geschrieben : | | Ich gehe auch nicht davon aus, dass auf der Konsolenebene fensterorientierte Dialoge möglich sind, |
Es geht wunderbar, weil von mir mehrfach so verwendet. Man muss nur die uses-Liste etwas dehnen.
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.02.12 20:23
bf109g.01 hat folgendes geschrieben : | Die kann ich nicht lesen. Sie blitzt nur kurz auf, bevor das Fenster schließt. Da ReadLN nicht ausgeführt wird, bleibt das Fenster auch nicht erhalten.
[..]
Ich mag die Konsole einfach... |
Dann solltest du dich vielleicht auch ein wenig damit beschäftigen...
Wie wäre es, wenn du dein Programm einfach aus einer Kommandozeile heraus aufrufst? Dann siehst du die Ausgaben auch.
Den Code schaue ich gleich an.
// EDIT:
Ich kann den Fehler nicht reproduzieren, hier gibt es zumindest keine Exception.
// EDIT2:
Ok, mal testweise Delphi 7 gestartet. Da schlägt dieser Aufruf fehl: Delphi-Quelltext 1: 2:
| if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then | GetLastError sagt auch nix.
Narses, sag du doch mal was als Delphi 7 Experte. 
|
|
bf109g.01 
      
Beiträge: 84
|
Verfasst: Fr 17.02.12 13:10
Martok hat folgendes geschrieben : | | Hier ist also noch ein anderer Fehler, ich tippe wirklich mal auf den unvollständigen Pfadnamen. Was passiert, wenn du da einen vollständigen Pfad verwendest, und/oder wo steigt er beim schrittweisen Ausführen aus? |
Der Code in diesem Threat hängt sich an der function PfadAendern auf.
Schrittweise springt der nämlich von
Delphi-Quelltext 1:
| 15: SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.', 'Arbeitsplatz', Result); |
nach
Delphi-Quelltext
Und dann schließt das ganze gleich.
|
|
Narses
      

Beiträge: 10184
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 17.02.12 14:39
Moin!
jaenicke hat folgendes geschrieben : | Narses, sag du doch mal was als Delphi 7 Experte.  |
Oh, ich bin D7-Experte?  Wusste ich noch gar nicht. Bisher habe ich mich für einen Nutzer gehalten...
Was soll ich dazu sagen, entweder man erstellt eine Konsolenanwendung, und dann hat SelectDirectory() da nix zu suchen, oder man schreibt eine VCL-Anwendung. Ich halte nix davon, beides zu mischen, also halte ich mich da raus.  (Und nach allem, was ich bisher an Interna gesehen und verstanden habe, sieht das Bor..In..Emba...dingsda auch so.  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|