TCustomControl > Scrollbalekn Automatisch ein und Ausblende

Rund um die LCL und andere Komponenten
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

TCustomControl > Scrollbalekn Automatisch ein und Ausblende

Beitrag von pluto »

Hallo,
in meinem PLEDIT habe ich das Problem das die Scroll Balken immer sichtbar sind. Ich möchte aber das sie nur sichtbar sind, wenn es nötig ist.
Hier der Relevante Code zum Scrollen:

Code: Alles auswählen

procedure TPLEdit.WMVScroll(var Message: TWMVScroll);
begin
  inherited;
  ScrollV(Message.ScrollCode);
end; // TPLEdit.WMVScroll
 
procedure TPLEdit.WMHScroll(var Message: TWMHScroll);
begin
 inherited;
  ScrollH(message.scrollcode);
end; // TPLEdit.WMHScroll
 
procedure TPLEdit.SetupScrollBars;
begin
  if (HandleAllocated) then begin
    if (TextBuffer.Count >0) {and (fTextBuffer.count-1 >= fTextBuffer.LinesPerPage-6) }then begin
      SV.cbSize := SizeOf(SV);
      SV.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL ;
      SV.nPos := TextBuffer.FirstLine;
      SV.nMin := 0;
      SV.nMax := TextBuffer.Count;
      SV.nPage:= TextBuffer.LinesPerPage;
      SetScrollInfo(Handle, SB_Vert, SV, true);
    end;
 
    if (TextBuffer.LastColum > 0) then begin
      SH.cbSize := SizeOf(SH);
      SH.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
      if TextBuffer.FirstColum = 1 then
        SH.nPos := 0
      else
        SH.nPos := TextBuffer.FirstColum;
 
      SH.nMin := 0;
      SH.nMax := TextBuffer.LongstColumn;
      SH.nPage:= TextBuffer.ColumPerPage;
      SetScrollInfo(Handle, SB_Horz, SH, true);
      if SH.nTrackPos = 1 then
        SH.nPos := 1;
 
    end;
  end
end; // TPLEdit.SetupScrollBars   
 
procedure TPLEdit.ScrollV(const aScrollCode: Integer);
begin
  with TextBuffer do begin
    Case aScrollCode of
      SB_TOP: FirstLine:=0;
      SB_BOTTOM: FirstLine:= LastLine;
      SB_LINEUP: if FirstLine > 0 then FirstLine:=FirstLine-1;
      SB_LINEDOWN: if FirstLine < LastLine then FirstLine:=FirstLine+1;
      SB_PAGEUP: if Firstline > LinesPerPage-1 then FirstLine:=FirstLine-LinesPerPage;
      SB_PAGEDOWN: if Firstline < LastLine then FirstLine:=FirstLine+LinesPerPage;
      SB_THUMBTRACK,SB_THUMBPOSITION: begin
        SV.cbSize := SizeOf(SV);
        SV.fMask := SIF_TRACKPOS;
        GetScrollInfo(Handle, SB_Vert, SV);
        FirstLine:=sv.nTrackPos;
//        matchFirstLastLine(sv.nTrackPos);
      end;
//      else
  //      exit;
    end; // Of Case
    NewPaint:=True; SetupScrollBars; Refresh;
  end;
end; // TPLEdit.ScrollV
 
procedure TPLEdit.ScrollH(const aScrollCode: Integer);
begin
 inherited;
 with TextBuffer do begin
   case aScrollCode of
     SB_TOP: FirstColum:=1;
     SB_BOTTOM: FirstColum:=LastColum;
 
     SB_LINELEFT: If FirstColum > 0 then FirstColum:=FirstColum-1;
     SB_LINERIGHT: If FirstColum < LastColum then FirstColum:=FirstColum+1;
     SB_PAGELEFT: If FirstColum > ColumPerPage-1 then FirstColum:=FirstColum-ColumPerPage;
     SB_PAGERIGHT: If FirstColum < LastColum then FirstColum:=FirstColum+ColumPerPage;
     SB_THUMBTRACK,SB_THUMBPOSITION: begin
       SH.cbSize := SizeOf(SH);
       SH.fMask := SIF_TRACKPOS;
       GetScrollInfo(Handle, SB_Horz, SH);
       if SH.nTrackPos = 0 then
         FirstColum:=1
       else
         FirstColum:= SH.nTrackPos;
     end
 //    else
   //     exit;
     end; // Of Case
    NewPaint:=True; SetupScrollBars; paint;
  end; // with
end; // TPLEdit.ScrollH
Ich hoffe diese Code-Ausschnitte sind ausreichend. Ich hoffe auch das mein Problem klar ist. Gibt es da eine Möglichkeit ? Wenn ja welche ?
Ich arbeite unter Linux(Debian, Lenny, KDE 3.....) mit GTK1
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TCustomControl > Scrollbalekn Automatisch ein und Ausblende

Beitrag von pluto »

Keiner eine Idee wie ich das hinbekommen könnte ?
MFG
Michael Springwald

Antworten