Avatar billede smith1 Nybegynder
12. oktober 2006 - 10:51 Der 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;
Avatar billede smith1 Nybegynder
13. oktober 2006 - 06:48 #1
er der ikke nogen der kan hjælpe?
Avatar billede stoney Nybegynder
13. oktober 2006 - 09:15 #2
Fra  hjælpen
Trim removes leading and trailing spaces and control characters from the given string S.

Slet selv mellemrum eller erstat dem med ingenting

eks

Memo1.text := stringreplace(Memo1.text, ' ', '', [RfReplaceAll]);

Stoney
Avatar billede smith1 Nybegynder
13. oktober 2006 - 10:12 #3
Ja, men så vil den også fjerne mellemrummet mellem 1 og til (\1 fil\)

så bliver det sådan her "C:\mappe\til\1fil\fil.exe" men skal være "C:\mappe\til\1 fil\fil.exe"
Avatar billede smith1 Nybegynder
13. oktober 2006 - 10:14 #4
Når jeg trimmer
"  C:\mappe\til\1 fil\fil.exe                                                  "
så ender den måske sådan her
"  C:\mappe\til\1 fil\fil.exe      "
Avatar billede smith1 Nybegynder
13. oktober 2006 - 10:20 #5
den trimmer ikke!?!? hvorfor?!?

  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;
Avatar billede stoney Nybegynder
13. oktober 2006 - 11:08 #6
Det må være din stringlist der er noget galt med.

Prøv at poste uNumFiles her

Stoney
Avatar billede smith1 Nybegynder
13. oktober 2006 - 11:19 #7
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

private
    FFileName: string;
    FFileList: TStringList;
    uNumFiles: integer;

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);

      Result := NOERROR;
    end;

  finally
    ReleaseStgMedium( Medium );
  end;
end;
Avatar billede stoney Nybegynder
13. oktober 2006 - 15:44 #8
Hvis jeg laver en stringlist med en masse mellemrum i slutningen af hver linie bliver
mellemrummene fjernet med trim.

Prøv at gemme din stringlist i en text fil og load og trim den.
Det må være en anden fejl, functionen trim virker.

Iøvrigt glemmer du at free FFileList.

Stoney
Avatar billede smith1 Nybegynder
14. oktober 2006 - 12:06 #9
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...
Avatar billede smith1 Nybegynder
17. oktober 2006 - 08:11 #10
Har prøvet det du sagde.. den gør det samme hvis jeg gemmer til en fil.

"C:\Documents and Settings\smith\Skrivebord\PaintDotNet.exe                        "
"C:\Documents and Settings\smith\Skrivebord\Notepad2.exe                          "

Den gemmer sti og mellemrum så der er præcis 261 tegn på hver linie!!
hvis jeg så loader den igen. så loader den KUN den første linie! ikke resten

MAX_PATH - Indeholder altid værdien 260.. har ikke set den indeholde andre værdier

      SetLength( FFileName, MAX_PATH );
      DragQueryFile( Medium.hGlobal, i, PChar(FFileName), MAX_PATH);
      FFileList.Add(FFileName);
Avatar billede a_nor Nybegynder
17. oktober 2006 - 09:04 #11
Hej Smith,

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 ?
Avatar billede smith1 Nybegynder
17. oktober 2006 - 09:21 #12
Det ved jeg sq ikke. Hvordan kan jeg tjekke det?

Har uploadet filen så du kan se hvordan den gemmer
http://www.gratisupload.dk/show.php?fileId=662
Avatar billede smith1 Nybegynder
17. oktober 2006 - 09:28 #13
hmmm det er ikke space..
http://img206.imageshack.us/img206/505/testlb6.png

Åbnede filen med notepad2...
Avatar billede a_nor Nybegynder
17. oktober 2006 - 10:25 #14
i følgende kode kan du erstatte s med din fFileList

procedure TForm1.Button1Click(Sender: TObject);
var s: tStringlist;
  i,j:integer;
  ss,st2:string;
  ch:char;
  by: byte absolute ch;
begin
st2:='';
s:= tStringlist.Create;
s.Add('  linie1  ');
s.Add('  linie2  ');

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;
Avatar billede a_nor Nybegynder
17. oktober 2006 - 10:31 #15
st2:='' skal nok lige flyttes ind under begin i "for i"
og så kan det selvfølgelig hænde at st2 bliver for lang med dine 161 ? tegn :-))
Avatar billede smith1 Nybegynder
17. oktober 2006 - 10:50 #16
Avatar billede a_nor Nybegynder
17. oktober 2006 - 11:02 #17
Prøv evt. at bruge Strpas() ved indlæsningen i ffilelist ?
Avatar billede a_nor Nybegynder
17. oktober 2006 - 11:11 #18
Du skal nok lave en rigtig Null string i stedet for at overføre en string med PChar.
Altså

Var a: array[0..255] of char;

DragQueryFile( Medium.hGlobal, i, a, MAX_PATH);
FFileList.Add(Strpas(a));
Avatar billede smith1 Nybegynder
17. oktober 2006 - 11:24 #19
Yes sir... så virker det! skal lige bruge et svar fra dig.
Avatar billede a_nor Nybegynder
17. oktober 2006 - 12:00 #20
Godt du kunne bruge det :))  har selv bøvlet MEGET med overførsel af strings i parameterlister.  Konklusion:  Lad være.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester