Zapamiętanie najwyższej wartości

0

Walczę z problemem i nie mogę dojść do finału.

Chcę zapamiętać najszerszy wpisany tekst w ListBoxie, aby ustawić ListBox1.ScrollWidth na długość tego najszerszego wpisu.

Owszem zapamiętuje najwyższą wartość, ale do czasu aż będzie podana mniejsza wartość od tej najwyższej. Wtedy pomimo że podaję kolejne szersze wpisy to on pamięta wartość kiedy ostatni raz był wpis przed zmiejszeniem.

Zagmatwane nie ? :D

var
x, y : integer;
begin
 ListBox1.Items.Add(Edit1.Text); // dowolnej długości tekst
 x := ListBox1.Canvas.TextWidth(Edit1.Text);

   if x > ListBox1.ScrollWidth then
    begin
      ListBox1.ScrollWidth := x;
      y := x;
 //     Label1.Caption := inttostr(x);
 //     Label2.caption := inttostr(y);
    end
else
   if x < ListBox1.ScrollWidth then
      begin
        ListBox1.ScrollWidth := y;
  //      Label1.Caption := inttostr(x);
  //      Label2.caption := inttostr(y);
      end;
end;

Wydaje mi się że brakuje w tym przykładzie jesze jednego porównania, ale w którym miejscu. heh :]

0

chyba powinienes sprobowac tak :

 x := length(Edit1.Text);

 if x > ListBox1.ScrollWidth then
    begin
      ListBox1.ScrollWidth := x;
</delphi>
0
var
x, y : integer;
begin
 ListBox1.Items.Add(Edit1.Text); // dowolnej długości tekst
 x := ListBox1.Canvas.TextWidth(Edit1.Text);

   if x > ListBox1.ScrollWidth then
    begin
      ListBox1.ScrollWidth := x;
      y := x;
 //     Label1.Caption := inttostr(x);
 //     Label2.caption := inttostr(y);
    end
else
   if x < ListBox1.ScrollWidth then
      begin
        ListBox1.ScrollWidth := y;
  //      Label1.Caption := inttostr(x);
  //      Label2.caption := inttostr(y);
      end;
end;
  1. W drugim if przypisujesz do szerokości ListBoxa wartość y, tyle że wartość ta jest ustawiana jedynie w tej części, która wykona się w razie gdy x jest większy niższerokość ListBox.

  2. Jeśli x jest mniejsze niż szerokość ListBox, to ta szerokość się nie zmienia, czyli drugi blok decyzyjny jest niepotrzebny.

  3. Zmienna y nie jest potrzebna, bo nie jest nigdzie używana (tylko w drugim bloku, ale to już wyjaśniłem).

  4. Największą wartość musisz zapisywać w jakiejś zmiennej globalnej lub zewnętrznie (w rejestrze, plikach INI, itp.). Za każdym razem jak wywołujesz tą procedurę, wartości x i y są zerowane, więc to nie ma sensu.

PS Bob, length zwraca ilość znaków w stringu, a tutaj jest potrzebna szerokość łańcucha znaków w pikselach (czyli TextWidth jest jak najbardziej prawidłowe).

0
Stark napisał(a)
  1. W drugim if przypisujesz do szerokości ListBoxa wartość y, tyle że wartość ta jest ustawiana jedynie w tej części, która wykona się w razie gdy x jest większy niższerokość ListBox.

  2. Jeśli x jest mniejsze niż szerokość ListBox, to ta szerokość się nie zmienia, czyli drugi blok decyzyjny jest niepotrzebny.

  3. Zmienna y nie jest potrzebna, bo nie jest nigdzie używana (tylko w drugim bloku, ale to już wyjaśniłem).

Przerobiłem tak:

var
  Form1: TForm1;
  x, y : integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items.Add(Edit1.Text);
 x := ListBox1.Canvas.TextWidth(Edit1.Text);

   if x > ListBox1.ScrollWidth then
    begin
      ListBox1.ScrollWidth := x + 25;
      y := x;
    end;

   if x < ListBox1.ScrollWidth then ListBox1.ScrollWidth := y + 25;
end;
Stark napisał(a)
  1. Największą wartość musisz zapisywać w jakiejś zmiennej globalnej lub zewnętrznie (w rejestrze, plikach INI, itp.). Za każdym razem jak wywołujesz tą procedurę, wartości x i y są zerowane, więc to nie ma sensu.

Rzeczywiście zmienne globalne dużo wniosły. [browar] Stark :)

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