[delphi] korte pad naam bepalen

Pagina: 1
Acties:

  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Topicstarter
Wastie weer, ik word hier dan ook nogal gestoord van.

als ik een directory + filenaam in een edit veld gooi en dan deze functie aanroep met die long als de edit.text, dan krijg ik netjes mn 8.3 dosformaat gebeuren terug. Maar doe ik dit vanuit een memorytabel (van rxlib) dus k haal daar uit een char veld de longname en gooi die door deze procedure, dan krijg ik niente de pasta terug.

!!HELP!! [trekt haren uit hoofd]

Misschien dat het komt door dat GetShortPathName een null terminated string of whatever moet zijn, maarre hoe maak ik dat van dat recordveldje of wat doe ik anders verkeerd?

function Tform1.LongToShortPath(const Long: string): string;
var
ActualLength: Longint;
begin
SetLength(Result, Length(Long) + 1);
ActualLength := GetShortPathName(PChar(Long), PChar(Result), Length(Result));
SetLength(Result, ActualLength);
end;

"Then there was the man who drowned crossing a stream with an average depth of six inches."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Tform1.LongToShortPath(const Long: string): string;
var
  ActualLength: Longint;
  dummy: pchar;
begin
  SetLength(dummy,255); // gok maar wat.
                // de lengte van een long
                // is 4 bytes dacht ik..
                // das dus 4 karakters.. en dat schiet niet op

  ActualLength := GetShortPathName(PChar(Long), dummy, 255);
  if actuallength > 0 then
     result:=string(dummy)
  else
    result:='';
end;

Niet getest.. dus er zou nog een fout in kunnen zitten :)

Maar wat jij deed was de lengte wel ERG kort zetten, en alleen de LENGTE van result zetten i.p.v. de inhoud.

Wat GetShortPathName teruggeeft is de lengte van het teruggeven padnaam. Als dat 0 is, is er iets misgegaan (zeer waarschijnlijk is dummy dan te klein). Als de lengte > 0 dan geeft ie het pad naam als string terug.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Topicstarter
Op maandag 24 december 2001 09:38 schreef Creepy het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Tform1.LongToShortPath(const Long: string): string;
var
  ActualLength: Longint;
  dummy: pchar;
begin
  SetLength(dummy,255); // gok maar wat.
                // de lengte van een long
                // is 4 bytes dacht ik..
                // das dus 4 karakters.. en dat schiet niet op

  ActualLength := GetShortPathName(PChar(Long), dummy, 255);
  if actuallength > 0 then
     result:=string(dummy)
  else
    result:='';
end;

Niet getest.. dus er zou nog een fout in kunnen zitten :)

Maar wat jij deed was de lengte wel ERG kort zetten, en alleen de LENGTE van result zetten i.p.v. de inhoud.

Wat GetShortPathName teruggeeft is de lengte van het teruggeven padnaam. Als dat 0 is, is er iets misgegaan (zeer waarschijnlijk is dummy dan te klein). Als de lengte > 0 dan geeft ie het pad naam als string terug.
Hey, niet helemaal, want het werkt wel (getest in een apart projectje) alleen niet met de path die ik er instopte, ik raakt namelijk ergens een '\' kwijt :). Nu werkt het prima, nu zit ik nog met het probleem dat het alleen werkt op xp en win2000, me 98 geven allebei 2x een blauwscherm :D. Jij misschien enig idee wrom?

"Then there was the man who drowned crossing a stream with an average depth of six inches."


Verwijderd

misschien zoiets:
code:
1
2
3
4
5
6
7
8
9
function LongToShortPath(const LongFileName: string): ansistring;
var
  ActualLength: Longint;
begin
  SetLength(Result, Length(LongFileName) + 1);
  ActualLength := GetShortPathName(PChar(LongFileName), nil, 0);
  SetLength(Result, ActualLength);
  GetShortPathName(PChar(LongFileName), pointer(result), ActualLength);
end;

Verwijderd

Op maandag 24 december 2001 09:38 schreef Creepy het volgende:
// gok maar wat.
// de lengte van een long
// is 4 bytes dacht ik..
// das dus 4 karakters.. en dat schiet niet op
De size van het type long = 4 (sizeof(long)), maar het gaat over de string long. length kan je niet gebruiken icm types.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

Op maandag 24 december 2001 13:52 schreef deur het volgende:

[..]

De size van het type long = 4 (sizeof(long)), maar het gaat over de string long. length kan je niet gebruiken icm types.
sizeof(integer) werkt bij mij gewoon hoor, zonder dat ik char heb gedefineerd natuurlijk. Hm.. ach ja.. wie gebruikt long dan ook als var. naam :)

Uit de Delphi HELP:

Pass a variable reference to SizeOf to determine the number of bytes used to represent the variable. Pass a type identifier to SizeOf to determine the number of bytes used to represent instances of that type. SizeOf is useful for determining the amount of memory to specify for the FillChar, Move, or GetMem procedures.

Oftewel, je kan er variabelen of variabele typen er in smijten, je krijgt dan of het geheugen gebruik van de var, of het geheugen gebruik van het type var. terug.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tom-my
  • Registratie: November 2000
  • Laatst online: 19-06 09:25

Tom-my

w03iz0rz

Topicstarter
soms zit het mee, soms niet zo heel erg :) hehehe

"Then there was the man who drowned crossing a stream with an average depth of six inches."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

nog steeds die crash? Hm.. denk dat ik het al zie.
Probeer eens
code:
1
getmem(dummy,255)

i.p.v.
code:
1
setlength(dummy,255)

. Natuurlijk niet vergeten na het gebruik van dummy een
code:
1
freemem(dummy)

te doen

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1