Prüfen ob Scrollbar aktiviert
Wie kann ich beim Memo gegenprüfen ob eine Scrollbar aktiviert wurde?
Grundsätzlich verfügt ein memo ja über beide Scrollbars Horiz/Vert Ich prüfe nun mit meinem Code ob diese zur verfügung stehen. Das problem ist nur Sie werden auch erkannt wenn sie nicht unter Eigenschaften aktiviert wurden (Sichtbar sind). Wie kann ich also gegenprüfen ob sie aktiviert wurden unabhängig vom Eigenschaftsdialog. Zur besseren Verständigung hier noch was Code!
Delphi-Quellcode:
function THookedScrollbar.StoreVertical(WinHandle: HWND): Boolean;
var State: Boolean; begin Result := False; VScrInfo.cbSize := SizeOf(VScrInfo); VScrInfo.fMask := SIF_ALL; // ScrollBar vorhanden? State := GetScrollInfo(WinHandle, Windows.SB_VERT, VScrInfo); // keine ScrollBar vorhanden if not State then exit; // Lese aktuelle Bar Parameter VScrBar.cbSize := Sizeof(VScrBar); GetScrollBarInfo(WinHandle, integer(OBJID_VSCROLL), VScrBar); // kopiere den aktuellen Rect zur späteren bearbeitung CopyRect(VertRect, VScrBar.rcScrollBar); Result := True; end; State liefert immer True zurück egal ob unter Eigenschaften die Bars eingeschaltet wurden oder nicht! gruss |
AW: Prüfen ob Scrollbar aktiviert
GetScrollInfo:
Zitat:
Das Problem hatte ich vor x Jahren auch einmal. Ich habe aber keine Möglichkeit im Win-API gefunden, die es ermöglicht, eindeutige festzustellen, ob eine integrierte Scrollbar sichtbar ist oder nicht. Ich hatte mir dann damit beholfen, Client- und Fenstergröße miteinander zu vergleichen. Ist also zum Beispiel die Clientbreite gleich der Fensterbreite minus Scrollbarbreite (evtl. noch den Rahmen berücksichtigen), ist die vertikale Leiste eingeblendet. Diese Lösung ist zwar nicht schön - funktioniert aber in den meisten Fällen. |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Zitat:
Muss mir das mal näher anschauen. PS: Leider gibt es ja sowas nicht in Delphi ScrollBars eines Fensters den eigenen Bedürfnissen anzupassen ( Kostenlos ohne Komponente) daher baue ich mir eine eigene LIB bzw.. Units die das ermöglichen sollen. Danke! gruss |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Viele Grüße |
AW: Prüfen ob Scrollbar aktiviert
Da ich ja immer noch daran arbeite:wink: kleiner Tip
Wenn hsi.nMax oder vsi.nMax<=0, wird die jeweilige Scrollbar nicht angeszeigt! Automatisch passt sich, in diesem Beispiel Dein Grid in der Grösse an und die zu zeichnnde Fläsche wird um die jweilige Scroolbar grösser Zitat:
GRuss alfold |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
In wie weit das jetzt mit einem Memo funktioniert muss ich wiederum erst testen. Jo ich mach das auch für meine SK_AERO LIB denke das ist einfacher zu händeln als wenn ich zwei ScrollBars einzeln anfertigen (Programmieren muss). gruss |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Schau mal unter meinen Projekten. gruss |
AW: Prüfen ob Scrollbar aktiviert
Allerdings, ist ganz wichtig!!!! Vermische nicht Daten mit Graphic:evil:
OT// muss Dein Miditracker, was die GraphicRoutinen betreffen neu machen, leider wenig Zeit//OT Gruss alfold |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Keine Ahnung was du meinst. Bei mir funktioniert das alles :) PS: Im Memo kann man die Scrollbar nicht auf Max = 0 stellen. Die scheint virtuell erstellt zu werden. gruss |
AW: Prüfen ob Scrollbar aktiviert
Ich weiss ja nicht was Du da machst aber in Deinem Grid funct es
Delphi-Quellcode:
Bei einem VCL Memo gibt es ja noch (ssHorizontal, ssVertical, ssNone, ssBoth)
hsi.cbSize := Sizeof(SCROLLINFO);
hsi.nMin := XSizeMid; hsi.nMax := (rc.Right) - (XSize - XSizeMid); //<--ist hier der wert <= 0 wird keine Scrollbar angezeigt hsi.nPos := StartX + XSizeMid; hsi.fMask := SIF_POS or SIF_RANGE; SetScrollInfo(FHGrid, SB_HORZ, hsi, True); Wenn ssHorizontal nicht aktiv ist passt sich xsize vom Memo auch an. Wie Du das bei Dir umgesetzt hast :gruebel: weiss ich ja nicht. EDIT: wenn also hsi.nMax = 0 dann darf ssHorizontal nicht aktiv sein! Gruss alfold |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Aber mir ist gerade etwas anderes aufgefallen: In einem TMemo werden bei ScrollBars:=ssBoth immer beide Leisten angezeigt, auch wenn sie nicht notwendig sind (dann eben nur deaktiviert). TMemo kennt ja irgendwie kein automatisches Ein- und Ausblenden der Scrollbars. Insofern ist mein Vorschlag, die Clientgröße des Fensters zu testen, völliger Unsinn, da die Leisten immer da sind... :pale: Was ich aber jetzt gefunden habe: SCROLLBARINFO Aus dem Parameter rgstate lassen sich Rückschlüsse darauf ziehen, ob ein Element (oder die gesamte Scrollbar) zum Beispiel unsichtbar (STATE_SYSTEM_INVISIBLE) oder deaktiviert (STATE_SYSTEM_UNAVAILABLE) ist. Ist wenig Text im Memo enthalten und die vertikale Scrollbar überflüssig, sieht der Status so aus:
Delphi-Quellcode:
Wird die vertikale Scrollbar benötigt, ändert sich das so:
ScrollBarInfo.rgstate[0]=STATE_SYSTEM_UNAVAILABLE; //gesamte Scrollbar deaktiviert
ScrollBarInfo.rgstate[1]=STATE_SYSTEM_UNAVAILABLE; //oberer Button deaktiviert ScrollBarInfo.rgstate[2]=STATE_SYSTEM_UNAVAILABLE; //Page up-Bereich deaktiviert ScrollBarInfo.rgstate[3]=STATE_SYSTEM_STATE_SYSTEM_INVISIBLE; //verschiebbarer Button unsichtbar ScrollBarInfo.rgstate[4]=STATE_SYSTEM_UNAVAILABLE; //Page down-Bereich deaktiviert ScrollBarInfo.rgstate[5]=STATE_SYSTEM_UNAVAILABLE; //unterer Button deaktiviert
Delphi-Quellcode:
Vielleicht hilft Dir das weiter...
ScrollBarInfo.rgstate[0]=0; //gesamte Scrollbar ist aktiviert
//... |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Bei meinem grid ist das normal weil die Scrollbar über CreateWindow erstellt wurde und ich zu jederzeit Einfluss auf die Value nehmen kann. Beim Memo geht das aber nicht oder aber du kannst mir sagen wo ich dort die Max Value einstellen kann. gruss |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Ich teste das mal mit der ListView oder anderer Komponente. Edit: ListView und TreeView funktionieren. gruss |
AW: Prüfen ob Scrollbar aktiviert
ListView, auch wenn es auf vsList steht?
Gruss |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
gruss |
AW: Prüfen ob Scrollbar aktiviert
Hmm... Das verstehe ich jetzt nicht.
Deine Frage bezog sich doch darauf, ob eine Scrollbar eines TMemo's aktiv ist, oder nicht (sichtbar ist sie ja leider permanent)!? Und das kann man doch sehr gut mit ScrollBarInfo.rgstate[0] überprüfen? Das funktioniert bei mir (Delphi XE, XP) ganz hervorragend:
Delphi-Quellcode:
function ScrollBarEnabled(Wnd: HWnd; Vert: Boolean): Boolean;
var ScrollBarInfo: TScrollBarInfo; IdObject: Integer; begin ScrollBarInfo.cbSize:=Sizeof(TScrollBarInfo); if Vert then IdObject:=OBJID_VSCROLL else IdObject:=OBJID_HSCROLL; Result:=GetScrollBarInfo(Wnd,IdObject,ScrollBarInfo) and (ScrollBarInfo.rgstate[0] and STATE_SYSTEM_UNAVAILABLE=0); end; |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Ich kann unter Eigenschaften die Scrollbar welche sichtbar sein soll auswählen. Bsp. ssVertikal Alle anderen sind dann im Designer auch nicht sichtbar das ist Fakt. Aber! Trotzdem bekomme ich bei der Abfrage siehe erster Beitrag bei State immer einen Positiven wert zurückgeliefert deshalb wird meine Virtuelle ScrollBar bei ssHorizontal trotzdem gezeichnet. Habe neue Version unter Projekte hochgeladen. Bilder werden jetzt gerendert. gruss |
AW: Prüfen ob Scrollbar aktiviert
nimm mal um zu testen STATE_SYSTEM_INVISIBLE.
STATE_SYSTEM_INVISIBLE – if invisible (not shown yet) STATE_SYSTEM_UNAVAILABLE – if disabled Wenn man dies abfragen kann, muss man es ja auch setzten können. //OT: aber mit Img sowas zu machen ist aber nicht der Renner oder? OT// gruss alfold |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Es wird ja niemand zu seinem Glück gezwungen! :) Wenn ich eine Skinned komponente habe nonvcl oder auch nicht.. dann sieht es besch.. aus wenn ausgerechnet die ScrollBar nicht dazu passt. Deine Vorschläge habe ich alle schon durch. ;) gruss |
AW: Prüfen ob Scrollbar aktiviert
Ich würde es mir nie wagen, Dich in Deinem Eifer zu Bremsen:-D
Zitat:
Wer hat schon Zeit sich dafür evtl erst noch img zu zeichnen/testen usw. Egal, wie Du schon sagst: "Es wird ja niemand zu seinem Glück gezwungen!":P Gruss alfold |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Das tue ich mir nicht an :) gruss |
AW: Prüfen ob Scrollbar aktiviert
Entschuldigung, wenn ich noch einmal nerve, aber mir hat die ganze Sache keine Ruhe gelassen und ich habe es noch einmal gestest:
Delphi-Quellcode:
Das funktioniert bei mir ohne Probleme mit einem TMemo.
function ScrollBarEnabled(Wnd: HWnd; Vert: Boolean): Boolean;
var ScrollBarInfo: TScrollBarInfo; IdObject: Integer; begin ScrollBarInfo.cbSize:=Sizeof(TScrollBarInfo); if Vert then IdObject:=OBJID_VSCROLL else IdObject:=OBJID_HSCROLL; Result:=GetScrollBarInfo(Wnd,IdObject,ScrollBarInfo) and (ScrollBarInfo.rgstate[0] and STATE_SYSTEM_UNAVAILABLE=0); end; function ScrollBarVisible(Wnd: HWnd; Vert: Boolean): Boolean; var ScrollBarInfo: TScrollBarInfo; IdObject: Integer; begin ScrollBarInfo.cbSize:=Sizeof(TScrollBarInfo); if Vert then IdObject:=OBJID_VSCROLL else IdObject:=OBJID_HSCROLL; Result:=GetScrollBarInfo(Wnd,IdObject,ScrollBarInfo) and (ScrollBarInfo.rgstate[0] and STATE_SYSTEM_INVISIBLE=0); end; |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
Habe das Projekt funktionstüchtig.. bis auf das hier genannte problem. Ich habe deine erste Version geprüft und die schlägt immer fehl (ScrollBarEnabled). Dann habe ich diese mit
Delphi-Quellcode:
ScrollBarInfo.rgstate[3] and STATE_SYSTEM_INVISIBLE=0
geprüft.. schlug auch fehl. Wenn du interesse an dem Projekt hast schikce ich dir gerne den Quelltext zu. Dann kannst du vor ort testen. Ist in D2009 geschrieben sollte also auch in XE ohne probleme laufen. EDIT: Du solltest aber das hier ScrollBarVisible..
Delphi-Quellcode:
ScrollBarInfo.rgstate[0] and STATE_SYSTEM_INVISIBLE=0
den Index 0 mit 3 ersetzen Oder? gruss |
AW: Prüfen ob Scrollbar aktiviert
Kannst Du mir gern zuschicken! Die Email-Adresse bekommst Du aus meiner VCard.
Index 0 betrifft die komplette Scrollbar, Index 3 nur den verschiebbaren Teil. Siehe MSDN. In meinem Test prüfe ich zuerst auf Sichtbarkeit und erst danach auf Enabled:
Delphi-Quellcode:
if ScrollBarVisible(Memo1.Handle,false) then
begin if ScrollBarEnabled(Memo1.Handle,false) then Label1.Caption:='enabled' else Label1.Caption:='disabled'; end else Label1.Caption:='not visible'; |
AW: Prüfen ob Scrollbar aktiviert
Zitat:
EDIT: Nur nochmal zur Info wenn die Horizontale Bar ausgeschaltet ist darf die Maske nicht gezeichnet werden. Suche einfach im Quelltext nach dem im ersten Thread erstellen Code. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz