Funkcja, stringList, tablica. Gdzie bug??

0

Witam. Więc jest tak...
Mam kilka funkcji: GetTextWidth - zwraca szerokość podanego tekstu w pikselach.
Biggest - zwraca największą liczbę ze znalezionych w podanym StringList

I mam takie tablice:

type 
 TK= record
 tyt: string;
//inne pola
end;

type
 TPole = record
 nazwa: string;
 len: integer;
end; 

var
 k: array of TK;
 p: array[0..10] of TPole;

Najpierw się ort!, jak wyglądają moje funkcje:

function TForm1.GetTextWidth(text: string; fs: TFontStyles): integer;
begin
 canvas.Font.Name:='Arial';
 canvas.Font.Size:=10;
 canvas.Font.Style:=fs;
 result:=canvas.TextWidth(text);
end;
//i ta funkcja jest ok, bo sprawdzałem


function TForm1.Biggest(s: TStringList): integer;
var
 i: integer;
 nw: integer;
begin
 nw:=0;
 for i:=0 to s.Count-1 do
     if nw<StrToInt(s.Strings[i]) then nw:=StrToInt(s.Strings[i]);
 result:=nw;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 s: TStringList;
begin
 s:=TStringList.Create;

for i:=0 to high(k) do
     begin
      s.Add(k[i].tyt);
      s.Strings[i]:=intToStr(GetTextWidth(s.Strings[i], []));
     end;

 p[5].len:=Biggest(s);
 s.Clear;
 s.Free;
end;

Oczywiście w odpowiednim miejscu zwiększam tablicę K :)
Teraz chodzi o to, że powiedzmy mam tekst, który pikselowo ma szerokość 495.

Robiłem ten program z debuggerem i wszystko niby było ok. Wszystko było ok, dopóki program nie opuścił funkcji BIGGEST. Chociaż w linii:
result:=nw;
pokazywał, że nw ma wartość 495.
Lecz gdy sprawdzam wartość pole[5].len (po wykonaniu funkcji Biggest oczywiście) wynik mam 195.

POLE[5].LEN powinno mieć wartość 495, a ma 195. Dlaczego? Gdzie tu jest jakiś błąd?

0

Masz tak:

for i:=0 to high(k) do
       begin
         s.Add(k[i].tyt);
         s.Strings[i]:=intToStr(GetTextWidth(s.Strings[i], []));
       end;

Sprobuj:

for i:=0 to high(k) do
       begin
         s.Add(k[i].tyt);
         s.Strings[i]:=intToStr(GetTextWidth(k[i].tyt, []));
       end;

nie daje gwarancji bo to nie duzo zmienia ale ....

0
for i:=0 to high(k) do
       begin
         s.Add(k[i].tyt);
         s.Strings[i]:=intToStr(GetTextWidth(s.Strings[i], []));
       end;

nie widzę sensu w tym fragmencie. dodajesz k[i].tyt do s (w indeksie i, bo lista była pusta) a potem natychmiast ten sam string (s[i]) zmieniasz na jego własną długość. to zresztą już mój poprzednik napisał.

function TForm1.Biggest(s: TStringList): integer;
var
 i: integer;
 nw: integer;
begin
 nw:=0;
 for i:=0 to s.Count-1 do
       if nw<StrToInt(s.Strings[i]) then nw:=StrToInt(s.Strings[i]);
 result:=nw;
end;

a tu zmienna nw jest niepotrzebna, możesz od razu operować na Result.

Co nie zmienia faktu, że nie widzę skąd błąd.

[dopisane] jeszcze jedno: deklarujesz tablice p :array [1..10] of TPole, odwołujesz się w kodzie do tablica pola a sprawdzasz (wg własnych słow) tablicę pole
[i jeszcze] masz rekord TPole a array of TPola

0

[dopisane] jeszcze jedno: deklarujesz tablice p :array [1..10] of TPole, odwołujesz się w kodzie do tablica pola a sprawdzasz (wg własnych słow) tablicę pole
[i jeszcze] masz rekord TPole a array of TPola

Tak, tak, źle napisałem na forum z tą tablicą, ale w programie jest dobrze napisane. Już poprawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1