![]() |
Spaltenresize im tlistview
Hallo DP!
Ich möchte, zwecks Benutzerfreundlichkeit, speichern, welche Breite den einzelnen Spalten eines Tlistviews vom Benutzer zugewiesen wurden, damit diese gespeichert werden können. Das soll aber nicht nur am Ende des Programms geschehen, sondern sobald der User die Spalten resized hat, soll der neue breite-wert gespeichert werden. Leider habe ich kein "oncolumnresize"-event oder ähnliches finden können, mit dem ich sowas hätte realisieren können. Hat da irgend jemand eine Idee? Gruß Jan |
Hallo,
um mitzukriegen wann eine Größenderung der Columns auftritt, fällt mir nur OnAdvancedCustomDrawItem ein. Wenn Du in einer Draw-Routine etwas tust, dann achte aber darauf, alles mit Flags abzusichern (z. B. Aktion nur ausführen wenn sich wirklich was geändert hat) damit Du nicht ein Draw-Ereignis provozierst und Deine Routine wieder aufgerufen wird. Viel Spass |
Hallo Gaius,
Onadvancedcustomdrawitem wird ja nur dann ausgeführt, wenn ein eintrag im tlistview in irgendeiner Weise dargestellt wird, aber hat mit den spalten ja wenig zu tu, und genau die will ich ja in der breite verändern. Abgesehen davon ahbe ich keinen blassen schimmer, wie ich aus diesem event heraus finden soll, ob da nun gerade die Größe einer Spalte geändert wurde, oder nicht. Hilfe ist also noch immer gefragt! Gruß Jan |
Also nach wildem rumsuchen im Netz hab ich folgendes gefunden:
![]() Aber wie ich damit jetzt genau umgehen soll, und was ich da letztenendes an meinem Prog rumschreiben muss verstehe ich absolut nicht! Könnte sich das vielleicht mal einer anschauen und mir weiterhelfen? Gruß Jan |
Hallo,
Zitat:
" Ein OnColumnResize Ereignis kann mit ein wenig Arbeit einer TListView hinzugefügt werden. Installiere die PBExListview Komponente, welche von der TListView abgeleitet ist. Die Komponente besitzt 3 neue Ereignisse: OnColumnResize, OnBeginColumnResize, OnEndColumnResize " Es haldelt sich hie rdabei um eine neue Komponente die von der normalen ListView abgeleitet ist. Diese musst Du Compilieren und installieren. Dann hast Du diese neuen Ereignisse zur Verfügung. Grüsse, Daniel :hi: |
Zitat:
Und muss ich dafür meinen Jetzigen listview ersetzen? Gruß Jan |
Weiß denn wirklich niemand wie man sowas macht? wenn das da so beschrieben steht, kann das ja nicht allzu extrem schwer sein. Ich brauche nur infos dazu, welche optionen in delphi ich da benutzen muss.
Gruß Jan |
Hallo Jan,
ich habe es auch noch nie gemacht, aber so könnte es gehen. Erste möglichkeit: Die Unit die beim SDC ist, speicher sie Dir mal auf die Festplatte. Der Name der Unit steht ja auch da. Dann klickst Du in Delphi im Menü auf Komponente\Komponente installieren. In dem Fenster was sich öffnet, klickst Du auf In neues Package. Dort namen und Pfad der Unit angeben und Namen und Verzeichniss für das neue Package angeben und dann auf OK. So, nun klickst Du auf Datei alles schliessen in DElphi, so das nur noch die IDE da ist und machst dann auf dieses neue Package ein Doppelklick. Das hat so ein orangenes Symbol. Danach sollte es installiert werden. Nachteil: Du wirst Deine jetzigen ListViews austauschen müssen. Zwei möglichkeit: //Wäre evtl. sinnvoller aber schwieriger Da Du Delphi Raumschiff hast, hast Du auch die Sources der ganzen Komponenten. Such Dir die für die normale ListView raus. Ergänze den Source um den vom SDC. Dann speichern und gleiche Prozedur wie oben durchführen. Mach Dir aber vorher ne Sicherung der normalen Unit. Dann sollte man bei der normalen LV die neuen Eigenschaften haben. Grüsse, Daniel :hi: |
Hallo Daniel B,
Also das 2. Hört sich da wesentlich besser an als das 1. Nun habe ich schonmal die unit comctrls.pas geöffnet und da den Abschnitt für tlistview rausgesucht. Dann habe ich den code ergänzt und die unit gespeichert, nachdem ich eine Sicherheitskopie gemacht habe. Dann habe ich auf kompo installieren geklickt, dann in neues package. Dann hab ich die comctrls.pas ausgesucht und dann als packagenamen comctrls angegeben. wenn ich jetzt bestätige, dann will Delphi direkt speichern und installieren. Das geht aber dann nicht, weil angeblich das package "vcl" bereits comctrls beinhaltet. Was mache ich falsch? Wenn du Zeit hast, könnte man sich ja mal im chat treffen. Gruß Jan |
Hallo,
leider kann ich sowas nicht testen, da bei PE keine Quelltexte dabei sind. Du solltest es aber mal mit einem anderen Namen versuchen. Einfach um mal zu sehen ob es überhaupt geht, ne es anders als comctrls als Package-Namen. Ansonsten könntest Du mal die vorhandenen Datein löschen und es einfach nochmal versuchen. Die ComCtrls.pas, .dcu löschen. Und die LV-Kompo von der Palette oben rausschmeissen. Und dann es nochmal versuchen, oder unter einem anderen Namen mal. Aber sichere Dir mal vorher! das DElphi-Verzeichniss. Mach Dir auf jedenfall gute Sicherungen. Am besten halt Delphi-Verzeichniss und Registry vor dem ausführen, wenn es schief geht, einfach zurück kopieren. Grüsse, Daniel :hi: |
Ich komme da einfach net weiter!
Entschuldige, dass ich ich dich grad im chat verpasst hab, aber ist halt schlecht, dass man da nix gemeldet bekommt. Also, wenn ich alles umbenenne, und die comtrls.dcu und .pas im lib bzw. src/vcl verzeichnis lösche, dann erscheint die fehlermeldung, dass sich meine modifizierte comctrls.pas selber aufruft. Die Unit selber habe ich auch shcon eingebunden, und die ist jetzt auch verfügbar, aber zum einen wäre es ein immenser Aufwand da jetzt mein Tlistview zu ersetzen, und zum anderen wüsste ich garnicht, wie ich da jetzt so einen modifizierten Tlistview auf meinem Form platzieren soll. Deswegen wollte ich mal fragen, ob man nicht vielleicht meinen existierenden Tlistview einfach vom typ her während der runtime umwandeln kann. weil das ja im grunde alles das gleiche ist, nur, dass da so 10 neue procs/funcs/props sind. Ich bin vollkommen hilflos und blick da grad 0,0garnichtmehr durch. HELP!! Jan |
Moin Jan,
das Beste wird sein, die Kompo aus dem SDC zu nehmen, und zu installieren. Anschliessend nimmst Du dann halt immer diese, statt der Standard ListView Kompo. Da dieser ListView von TListView abgeleitet ist, dürfte es ansonsten keinen Unterschied machen, nur das dann eben die neue Variante noch zusätzlich über die Resize Events verfügt. Alles andere wäre dann wie gehabt. |
Hallo Christian,
da magst du zwar recht haben aber da stellen sich mir ja immer noch 2 Probleme, wie ich sie schon oben beschrieben habe: Ich habe keine Ahnung wo ich da jetzt die Graphische oberfläche für die neue Kompo herbekomme, und ich würde das halt gerne auch in dem Tool verwenden, an welchem ich gerade Arbeite, da dieses Hauptsächlich um den Tlistview herumgebaut ist, und mittlerweile ca 1100 zeilen code beinhaltet. Also wäre das ein riesen Aufwand für mich. Gruß Jan |
Hallo Jan,
Zitat:
So tragisch wird das schon nicht. :mrgreen: Ist ja noch im vierstelligen Bereich. Aber es wäre am einfachsten. Grüsse, Daniel :hi: |
und die ganzen on****-procedures?, die bereits angelegt sind? Und die Spalten, die ich dann komplett neu anlegen und resizen muss?
Naja, ich werds mal probieren.. Gruß Jan |
Moin Jan,
welche graphische Oberfläche? Mit dem Standardicon für visuelle Komponenten wirst Du wohl leben können. ;-) Durch das Löschen einer Kompo vom Formular, werden die Onxxx Prozeduren nicht beeinflusst. Du müsstest sie nur bei der neuen Kompo neu zuweisen. Die eigentliche Routine bleibt ja bestehen. Falls Du das noch nicht gemacht hast: Auf die Seite Ereignisse des OI gehen, das entsprechende Ereignis auswählen, und dann aus der DropDown Liste das zuzuweisende Ereignis auswählen. Bei 1100 Zeilen dürfen das nicht allzuviele in Frage kommende Prozeduren sein. Am Besten bindest Du wohl mal die Kompo ein und probierst sie mal aus. Da es sich um einen ganz normalen ListView mit ein paar zusätzlichen Ereignissen handelt wirst Du allerdings keinen grossen Unterschied bemerken dürfen. |
Mit graphischer oberfläche meine ich: Wo finde ich jetzt den Tlistview in delphi, damit ich den platzieren kann?
Danke für alle Hilfe Gruß Jan |
Zitat:
Grüsse, Daniel :hi: |
neee, das ist doch nur, wenn ich den code umschreibe. Aber ich hab ja jetzt die gegebene unit einfach installiert, und weiss jetzt nicht was ich machen muss um den neuen tlistview zu erhalten.
Im Normalen listview sind die neuen Funktionen im Moment nicht enthalten. Ich glaube so langsam, dass das Komponenten System von Delphi der letzte ***** ist, ich weiss wirklich überhaupt nicht, was ich falsch mache. BB Jan |
Moin Jan,
also ich hab's folgendermassen gemacht:
Wenn man in der Prozedure Register eine andere Stelle angibt wird sie dort gespeichert. |
Hallo Christian, viiieeelen Dank!
Also das einzige was ich jetzt wirklich wissen musste war punkt 9: Zitat:
Ist zwar nicht wichtig, aber interressiert mich halt. Jetzt funktioniert auf jeden Fall mal was ich machen wollte. Gruß Jan |
Moin Jan,
ich hab's gerade mal ausprobiert: Bei mir wird's nur einmal ausgeführt. Hiermit geprüft:
Delphi-Quellcode:
var
iCount : integer = 0; implementation procedure TfrmMAIN.PBExListview1EndColumnResize(Sender: TCustomListView; columnindex, columnwidth: Integer); begin inc(iCount); StaticText1.Caption := IntToStr(iCount); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz