[delphi] Eerste x-aantal karakters weghalen

Pagina: 1
Acties:

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Ik ben bezig met een Tekstverwerkertje in delphi(5) en daarin heb ik een statusbar die de filename(+path) moeten laten zien. Die statusbar bied echter slechts plaats voor 20 karakters dus als de string langer is dan dat moeten er vanaf het begin de overtollige karakters eraf gehaald worden zodat ten alle tijden de filename zichtbaar is, het pad heeft tenslotte in zo'n situatie een lagere prioriteit...
Daarvoor had ik het volgende stukje code bedacht:
code:
1
2
3
4
5
6
7
8
9
10
if Length(Filename)>20 then
  begin
    n:=Length(Filename)-20; //hoeveel eraf?
    for i:=1 to Length(Filename) do
    begin
      if i>=n then
        s[i-n]:=Filename[i];
    end;
    Filename:=s;
  end;

Waarbij Filename en S strings zijn en i en n integers.
Leek mij allemaal redelijk in orde maar ik krijg een access-violation zogauw ik deze functie aan roep :(

Wat doe ik fout? Zal wel iets heel stoms zijn maargoed... *zucht*

Rookworst zonder R is ook worst.


  • Jelmer
  • Registratie: Maart 2000
  • Nu online
code:
1
 if i>=n then

Als je in pascal (==delphi) op de 1e (0 dus, i==n->i-n==0) positie van een string een andere waarde zet, verander je daarmee de lengte van de string.

Je kunt denk ik beter de methode Copy gebruiken.

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Mmm, en hoe werkt dát dan?

Rookworst zonder R is ook worst.


  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 23:24
Al aan de functie:

MinimizeName

gedacht...?

bron: http://www.swissdelphicenter.ch/en/showcode.php?id=252

  • brid
  • Registratie: Januari 2001
  • Laatst online: 30-07 16:21

brid

Onze excuses voor het ongemak

ga naar help en zoek naar de functie copystr want ik weet niet zeker.
maar je moet op zo iets uitkomen:
code:
1
2
while pos('\',Tmp) <> 0 do
  tmp:=copystr(tmp,pos('\',Tmp)+1,length(tmp)-pos('\',Tmp));

effe wat uitleg je zoekt iedere keer naar de '\' dus als je bv c:\etc\hier\daar\bestand.doc hebt krijg je eerst de postitie door van de \ na c:\. Hierna kopiert hij van af de positie na de \ t/m het het einde van de string. Dit doet hij totdat er geen \ meer vind en dan hou je dus de bestandsnaam over.

deze code klopt denk ik niet helemaal, maar het is een duw in de goede richting.

En wat jij wilt is helemaal simpel:
code:
1
filename:=copystr(filename,length(filename)-20,20)

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Probeer dit eens:
code:
1
2
3
4
5
6
7
8
if Length(FileName) > 20 then
begin
  NewName := '';
  Start := Length(FileName) - 20;
  for Loop := Start to Length(FileName) do
    NewName := NewName + FileName[Loop];
  FileName := NewName;
end;

  • BezurK
  • Registratie: Juni 2001
  • Laatst online: 14-06 09:12
Ik heb het al voor elkaar met de Copy functie :D
Ik heb het gewoon als volgt gedaan, werkt perfect:
code:
1
2
3
4
5
6
if Length(Filename)>20 then
 begin
   n:=Length(Filename)-20;
   s:=Copy(Filename,n,Length(Filename));
   Filename:=s;
 end;

Thx allemaal! :)

Rookworst zonder R is ook worst.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:59

Creepy

Tactical Espionage Splatterer

Voor karakters weghalen uit een string is er ook altijd nog delete()

"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


  • Glival
  • Registratie: December 1999
  • Laatst online: 05-09 21:59
Op donderdag 24 januari 2002 21:08 schreef BezurK het volgende:
Ik heb het al voor elkaar met de Copy functie :D
Ik heb het gewoon als volgt gedaan, werkt perfect:
code:
1
2
3
4
5
6
if Length(Filename)>20 then
 begin
   n:=Length(Filename)-20;
   s:=Copy(Filename,n,Length(Filename));
   Filename:=s;
 end;

Thx allemaal! :)
Werkt
code:
1
2
if Length(Filename) > 20 then
    Filename := Copy(Filename, Length(Filename)-20, 20)

niet?

  • ArieProductions
  • Registratie: Januari 2002
  • Laatst online: 27-11-2024
ff gecheked, maar Delphi 6 doet beide goed, wat is het probleem ?


P.S. laatste statement nog wel afsluiten met ';'

"Quidquid latine dictum sit, altum videtur" (Whatever is said in Latin sounds profound)


Verwijderd

Op donderdag 24 januari 2002 20:38 schreef Jelmer Barhorst het volgende:
code:
1
 if i>=n then

Als je in pascal (==delphi) op de 1e (0 dus, i==n->i-n==0) positie van een string een andere waarde zet, verander je daarmee de lengte van de string.

Je kunt denk ik beter de methode Copy gebruiken.
Beetje zeurmode:
pascal != delphi
object pascal == delphi

Een normale string in Delphi gebruikt karakter 0 niet langer meer voor de lengte (ShortString wel).
/Einde beetje zeurmode

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:59

Creepy

Tactical Espionage Splatterer

Op vrijdag 25 januari 2002 09:38 schreef hvdberg het volgende:

[..]

Beetje zeurmode:
pascal != delphi
object pascal == delphi

Een normale string in Delphi gebruikt karakter 0 niet langer meer voor de lengte (ShortString wel).
/Einde beetje zeurmode
bij een ansistring heeft het eerste karakter ook index 1 i.p.v. 0 zoals bij alle stringtypen in pascal. Dat de lengte niet meer in index 0 staat maakt niet uit. Bij een stringtype in (object) pascal heeft het eerste karakter altijd index 1.

Wil je "strings" zoals in C wilt gebruiken, gebruik dan een pchar.
[extra zeurmodes]
object pascal != Delphi. Delphi = Object Pascal + VCL + Borland IDE. :)
[/extra zeurmodes]

"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


Verwijderd

Op vrijdag 25 januari 2002 10:15 schreef Creepy het volgende:

[..]

bij een ansistring heeft het eerste karakter ook index 1 i.p.v. 0 zoals bij alle stringtypen in pascal. Dat de lengte niet meer in index 0 staat maakt niet uit. Bij een stringtype in (object) pascal heeft het eerste karakter altijd index 1.

Wil je "strings" zoals in C wilt gebruiken, gebruik dan een pchar.
[extra zeurmodes]
object pascal != Delphi. Delphi = Object Pascal + VCL + Borland IDE. :)
[/extra zeurmodes]
:)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:46

Tomatoman

Fulltime prutser

Kijk eens naar DrawText en dan vooral de uFormat parameter. Onderstaand voorbeeld schrijft de bestandsnaam FileName in een TPaintBox (PaintBox1). De naam wordt automatisch afgekort tot iets als
C:\Program Files\Borla...\Delphi32.exe
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMain.DrawFileName(FileName: TFileName);
var
  BoundingRect: TRect;
  PName: PChar;
begin
  PName := PChar(FileName);
  with PaintBox1 do
    BoundingRect := Rect(0, 0, Width, Height);
  with PaintBox1.Canvas do
  begin
    Brush.Color := clBtnFace;
    FillRect(BoundingRect);
    Font.Color := clNavy;
    Font.Name := Main.Font.Name;
    DrawText(Handle, PName, -1, BoundingRect, DT_PATH_ELLIPSIS or
    DT_SINGLELINE or DT_VCENTER);
  end;
end;

[edit] Twee regels code toegevoegd

Een goede grap mag vrienden kosten.

Pagina: 1