Avatar billede delphin Nybegynder
04. august 2002 - 13:19 Der er 5 kommentarer og
1 løsning

Scrollbar

Hvordan sætter man en Scrollbars position uden mus?

Fx i en memo vil jeg gerne kunne sætte scrollbaren så jeg kan se et bestemt afsnit af teksten.
Avatar billede dkn Nybegynder
04. august 2002 - 15:58 #1
procedure TForm1.ScrollBar1Change(Sender: TObject);
function LineCount: integer;
var X, Y: integer;
begin
  Result := 0; Y := length(Memo1.Text);
  if Y > 0 then
  for X := 1 to Y do if Memo1.Text[X] = #13 then inc(Result);
end;

function GoToLine(LineNo: integer): string;
var P1, P2, Y: integer;
begin
  Y := 1; P1 := 0;
  P2 := pos(#13, copy(Memo1.Text, P1, Length(Memo1.Text))) - 1;
  while Y < LineNo do
  begin
    P1 := P1 + P2 + 2; {2 to include #13#10}
    P2 := pos(#13, copy(Memo1.Text, P1 + 1, Length(Memo1.Text))) - 1;
    inc(Y);
  end;
  Memo1.SetFocus;
  Memo1.SelStart := P1;
  Memo1.SelLength := P2;
  Result := Memo1.SelText;
end;

begin
  ScrollBar1.Min := 1;
  ScrollBar1.Max := LineCount;
  GoToLine(ScrollBar1.Position);
end;


procedure TForm1.ScrollBar1Enter(Sender: TObject);
begin
ScrollBar1Change(Self);
end;
Avatar billede delphin Nybegynder
04. august 2002 - 18:44 #2
Undskyld... jeg kan godt se, at det virker for en memo, men jeg skal bruge det i en richedit (det burde jeg have skrevet), og her virker det mærkeligt nok ikke...

Jeg troede bare man kunne skrive noget i stil med:

memo1/richedit1.???.scrollbarposition??:=??

I øvrigt kunne du (tror jeg nok) bare have skrevet ScrollBar1.Max := memo1.lines.count; i stedet for hele den funktion der tæller linjer...

Ved du hvilke ændringer, der skal laves i dit forslag for at få det til at virke for en richedit?
Avatar billede dkn Nybegynder
04. august 2002 - 19:03 #3
Det var noget bæ kode....

hvis jeg var dig ville jeg bruge noget som:

with RichEdit1 do
begin
        SelStart := length(text);
        Perform(EM_SCROLLCARET, 0, 0)
end;

eller

//SendMessage(RichEdit1.Handle, WM_VSCROLL, SB_PAGEDOWN, 0);
SendMessage(RichEdit1.Handle, WM_VSCROLL, SB_PAGEUP, 0);

vil se om jeg kan få tid til at lave en function så du kan gå direkte til linier
Avatar billede dkn Nybegynder
04. august 2002 - 19:05 #4
Du kan også gøre sådan her:

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
ScrollBar1.Max := length(RichEdit1.Text);
ScrollBar1.Min := 1;

with RichEdit1 do
begin
        SelStart := ScrollBar1.Position;
        Perform(EM_SCROLLCARET, 0, 0)
end;
end;
Avatar billede dkn Nybegynder
04. august 2002 - 19:21 #5
ok det her skulle virke, det er måske ikke den bedste måde, men hvad kan du forlange :)

procedure TForm1.GoToLine(Nr: integer);
var
  Text: string;
  i: integer;
begin
  Text := '';
  for I := 0 to Nr do
    Text := Text +#13#10+ RichEdit1.Lines.Strings[I];

    RichEdit1.SelStart := length(Text);
    RichEdit1.Perform(EM_SCROLLCARET, 0, 0)
end;


procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  GoToLine(ScrollBar1.Position);
end;

procedure TForm1.ScrollBar1Enter(Sender: TObject);
begin
  ScrollBar1.Max := RichEdit1.Lines.Count;
  ScrollBar1.Min := 0;
end;
Avatar billede delphin Nybegynder
05. august 2002 - 00:34 #6
Ja, det virker... super.. mange tak...
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