Autor Beitrag
bf109g.01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Do 16.02.12 18:49 
Hallo, baue gerade eine Konsolenanwendung. Diese schließt sich sofort, nachdem ich die folgende function aufgerufen habe...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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? :gruebel:
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Do 16.02.12 20:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Einen Dialog in einer Konsolenanwendung? Bist du sicher, dass die Idee gut ist? :gruebel:
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...

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie sieht denn der weitere Code aus?

ausblenden volle Höhe Delphi-Quelltext
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;
  
// Zielverzeichnis auswählen
function PfadAendern: string;
begin
  SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.''Arbeitsplatz', Result);
end;

// Verknüpfung erstellen
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;

// Systemordner herausfinden (Systemunabhängig)
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
  // Ordner erstellen
  Pathcreate:=PfadAendern+'\'+PName; // <<<<<<<<<<<<<< hier kackt es ab. Alles darunter passiert nicht mehr.

  CreateDirectory(PChar(PathCreate),nil);

  WriteLN('Directory created:');WriteLN(Pathcreate);

  // Link erstellen
  CreateLink(Pathcreate+'\'+PName+'.exe',// Ziel
                GetShellFolder($0007)+'\'+Pname+'.exe.lnk',// Speicherort der verknüpfung
                'Testverknüpfung'); // Verknüpfungs Beschreibung

  // Autostart Ordner
  WriteLN(GetShellFolder($0007));

end;


begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  mach('Test');
  write('test');

  ReadLN;
end.

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.02.12 20:23 
user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
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. :zwinker:

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:
ausblenden Delphi-Quelltext
1:
2:
if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
GetLastError sagt auch nix. :nixweiss:

Narses, sag du doch mal was als Delphi 7 Experte. ;-)
bf109g.01 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84



BeitragVerfasst: Fr 17.02.12 13:10 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden Delphi-Quelltext
1:
15:  SelectDirectory('Verzeichnis wählen, in welches kopiert werden soll.''Arbeitsplatz', Result);					

nach
ausblenden Delphi-Quelltext
1:
95end;					

Und dann schließt das ganze gleich.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 17.02.12 14:39 
Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Narses, sag du doch mal was als Delphi 7 Experte. ;-)
Oh, ich bin D7-Experte? :shock: 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. :nixweiss: (Und nach allem, was ich bisher an Interna gesehen und verstanden habe, sieht das Bor..In..Emba...dingsda auch so. :idea:)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.