Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Spaltenresize im tlistview (https://www.delphipraxis.net/3175-spaltenresize-im-tlistview.html)

Jan 26. Feb 2003 22:12


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

Gaius 27. Feb 2003 08:05

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

Jan 27. Feb 2003 17:40

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

Jan 27. Feb 2003 20:28

Also nach wildem rumsuchen im Netz hab ich folgendes gefunden:


http://www.swissdelphicenter.ch/torr...de.php?id=1264

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

Daniel B 27. Feb 2003 21:19

Hallo,
Zitat:

Zitat von Jan
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?

Es steht ja da:
" 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:

Jan 27. Feb 2003 21:58

Zitat:

Diese musst Du Compilieren und installieren.
Dann hast Du diese neuen Ereignisse zur Verfügung.
ganz dumm gefragt: Wie geht das?
Und muss ich dafür meinen Jetzigen listview ersetzen?
Gruß
Jan

Jan 1. Mär 2003 14:12

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

Daniel B 1. Mär 2003 14:57

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:

Jan 1. Mär 2003 16:19

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

Daniel B 1. Mär 2003 17:10

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:

Jan 1. Mär 2003 17:44

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

Christian Seehase 1. Mär 2003 17:45

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.

Jan 1. Mär 2003 17:51

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

Daniel B 1. Mär 2003 17:58

Hallo Jan,
Zitat:

Zitat von Jan
und mittlerweile ca 1100 zeilen code beinhaltet. Also wäre das ein riesen Aufwand für mich.

Du setzt die neue Komponente aufs Formular, nachdem Du die alten gelöscht hast. Jetzt gibt Du der neuen den gleichen Namen wie der alten LV. Somit ändert sich ncihts am Code und Du hast die neue Komponente. Und von den 1000 Zeilen sind mind. die hälfte eh von Delphi angelegt. ;)
So tragisch wird das schon nicht. :mrgreen: Ist ja noch im vierstelligen Bereich.
Aber es wäre am einfachsten.

Grüsse, Daniel :hi:

Jan 1. Mär 2003 18:00

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

Christian Seehase 1. Mär 2003 19:05

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.

Jan 1. Mär 2003 21:09

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

Daniel B 1. Mär 2003 22:05

Zitat:

Zitat von Jan
Mit graphischer oberfläche meine ich: Wo finde ich jetzt den Tlistview in delphi, damit ich den platzieren kann?

Wenn alles geklappt hat, musst Du nur noch die "normale" LV einfügen. Diese dürfte dann die neuen Eigenschaften haben.

Grüsse, Daniel :hi:

Jan 1. Mär 2003 22:47

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

Christian Seehase 2. Mär 2003 01:02

Moin Jan,

also ich hab's folgendermassen gemacht:
  1. Neue Anwendung
  2. Neue Unit
  3. Den Quellcode der neuen Unit durch den aus dem SDC ersetzen (kopiert von Unit PBExListview; bis END.), bis auf die unit unit2; Zeile
  4. nur diese zweite Unit abgespeichert, in einem Verzeichnis für die neue Kompo, dabei als PBExListView.pas benannt.
  5. Dann im Menü Komponente den Punkt Komponente installieren nehmen
  6. In neues Package (den Pfad aus der Seite "in bestehendes Package" übernehmen)
  7. den Pfad zu der PBExListView.pas raussuchen
  8. Kompilieren und installieren bestätigen
  9. Jetzt befindet sich die neue Kompo in der Komponentenpalette im Reiter PBGoodies

Wenn man in der Prozedure Register eine andere Stelle angibt wird sie dort gespeichert.

Jan 2. Mär 2003 13:40

Hallo Christian, viiieeelen Dank!
Also das einzige was ich jetzt wirklich wissen musste war punkt 9:

Zitat:

Jetzt befindet sich die neue Kompo in der Komponentenpalette im Reiter PBGoodies
Alles andere hatte ich auch schon gemacht. Jetzt stellt sich nurnoch eine Frage: warum wird das onendcolumnresize 2 mal ausgeführt?
Ist zwar nicht wichtig, aber interressiert mich halt.
Jetzt funktioniert auf jeden Fall mal was ich machen wollte.

Gruß
Jan

Christian Seehase 2. Mär 2003 14:16

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 22:35 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