12. oktober 2006 - 10:51Der er
19 kommentarer og 1 løsning
ActiveX context menu
Filnavnene bliver tilføjet til en tstringlist.. men hvorfor er der tomme melemrum i filnavnene? f.eks. " C:\mappe\til\1 fil\fil.exe "
uNumFiles = Antal filer valgt. Tilføjer dem i ShellInit. Har prøvet Trim() men den trimmer ikke godt nok.. den trimmer en del af mellemrumne, men ikke den alle!?
function WinContextMenu.InvokeCommand( var CommandInfo: TCMInvokeCommandInfo ): HResult; var i:integer; begin Result := E_FAIL; if (HiWord(Integer(CommandInfo.lpVerb)) <> 0) then // kein Anwendungsaufruf Exit;
// überprüfe den Index (0..Anzahl Menüpunkte - 1) if LoWord(CommandInfo.lpVerb) > 4 then begin Result := E_INVALIDARG; Exit; end;
// Zeige je nach gewählten Menüpunkt eine Info an case LoWord(CommandInfo.lpVerb) of 0: ShellExecute(0, 'open', 'notepad.exe', '', nil, SW_SHOW); 1: ShellExecute(0, 'open', 'calc.exe', '', nil, SW_SHOW); 2: begin showmessage('Antal Filer: ' + inttostr(uNumFiles)); for i:=0 to uNumFiles do begin showmessage(Trim(FFileList[i])); end; end; end; Result := NOERROR; end;
case LoWord(CommandInfo.lpVerb) of 0: ShellExecute(0, 'open', 'notepad.exe', '', nil, SW_SHOW); 1: ShellExecute(0, 'open', 'calc.exe', '', nil, SW_SHOW); 2: begin showmessage('Antal Filer: ' + inttostr(uNumFiles)); for i:=0 to uNumFiles do begin test := stringreplace(FFileList[i], ' ', '', [RfReplaceAll]) showmessage(test); end;
Det er her jeg tilføjer til stringlist og finder ud af hvor mange filer der er valg, uNumFiles. Alle de valgte filer bliver tilføjet, men de har allle sammen en masse mellemrum til sidst
function WinContextMenu.ShellInit( Folder: PItemIDList; DataObject: IDataObject; ProgID: HKEY ): HResult; var Medium: TStgMedium; FE: TFormatEtc; i: integer; begin if DataObject = nil then begin Result := E_FAIL; Exit; end;
with FE do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end;
// Transfer the data referenced by the IDataObject reference to // an HGLOBAL storage medium in CF_HDROP format. Result := DataObject.GetData( FE, Medium ); if Failed( Result ) then Exit; try FFileList := TStringList.Create; uNumFiles := DragQueryFile( Medium.hGlobal, $FFFFFFFF, nil, 0)-1; for i:=0 to uNumFiles do begin SetLength( FFileName, MAX_PATH ); DragQueryFile( Medium.hGlobal, i, PChar(FFileName), MAX_PATH); FFileList.Add(FFileName);
Ja, jeg skal lige free den i InvokeCommand efter jeg har kørt min løkke med Showmessage()
Trim virker også når jeg bruger den, men trimmer bare ikke det hele. Hvis jeg ikke bruger Trim så er min messagebox så bred at hele messageboxen ikke kan se på skærmen, messageboxens OK knap er også uden for skærmen. Hvis jeg trimmer den inden jeg messagebox'er den så kan hele messageboxen se på skærmen, men der er stadig en masse mellemrum.
Vil lige prøve at gemme den til en fil som du sagde... men det kan først blive på mandag da jeg ikke lige har koden på denne PC som jeg er ved nu...
Er du sikker på det er spaces (#32) der er placeret i strengen og ikke andet? man kunne tænke sig den afsluttet med #8 eller #13#10 f.eks. og så virker trim vel ikke ?
for i:=0 to s.Count-1 do begin for j:=1 to length(s[i]) do begin ch := (s.strings[i][j]); Str(by,ss); st2 := st2 +'.'+ ss; end; Messagebox(0,pChar( '>'+trim(s[i])+'< '+st2),'',0); end; s.Clear; s.Free; end;
Godt du kunne bruge det :)) har selv bøvlet MEGET med overførsel af strings i parameterlister. Konklusion: Lad være.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.