![]() |
Tabelle und Rahmen
Hallo,
ich möchte in einem Programm eine Tabelle einfügen, die zur reinen Anzeige verwendet werden soll(keine Rechenoperationen nötig). Bei einer bestimmten Bedingung soll dann eine Zeile unterstrichen werden, quasi wie bei Excel der untere Rahmen einer Zelle oder Zeile unterstrichen werden. Außerdem möchte ich die Dicke des Rahmens bestimmen können. Welches Tool verwende ich dazu am besten? Habe es mit einer ListView versucht und da mit einem CustomDrawItem, aber bekomme das nicht hin. Die Unterstreichung sollte am besten an den Zeilenindex gekoppelt sein Ach ja: die Tabelle soll man nachher auch inklusive der Unterstreichungen ausdrucken können. Gruß pauletta82 |
Re: Tabelle und Rahmen
Herzlich willkommen in der Delphi-PRAXiS, pauletta82.
Ich würde eher auf TWebBrowser setzen und die Tabelle mittels HTML / CSS gestalten. Dabei würde ich sogar noch den Zwischenschritt über XML einlegen. Freundliche Grüße vom marabu |
Re: Tabelle und Rahmen
Vlt. hilft dir das:
![]() Drucken wird da schon etwas komplizierter ... |
Re: Tabelle und Rahmen
Achya, zum Thema TWebBrowser und HTML: Es geht. Allerdings auch nicht viel leichter als mit dem Delphi-Printer. Dazu ist man vom Browser abhängig und hat einige Einschränkungen (wie zB. keine neue Seite anfangen zu können, keinen Drucker auswählen zu können, etc.). Also kommt es ganz drauf an was und wie mans braucht ...
|
Re: Tabelle und Rahmen
es geht mir nicht drum Farbe oder Hintergrund zu verändern, ich müsste eine Linie unter einer Zeile machen können...
Zitat:
|
Re: Tabelle und Rahmen
das mit html zu machen ist eher schlecht, da sich die anzeige laufend aktualisieren soll (also nach jeder bestätigung einer eingabe). bei dem programm handelt es sich um eine art taschenrechner, der die eingegebenen zahlen aufsummieren soll und quasi jede neue zahl in eine neue zeile schreiben soll
Zitat:
|
Re: Tabelle und Rahmen
Das weiß ich ... aber du solltest ja etwas selber machen :-D
Im OnCustomDrawItem:
Delphi-Quellcode:
(Sender as TListView).Canvas.Font.Style := [fsUnderline];
[edit] Wenn du es wirklich nur zur Anzeige verwenden willst und ein Benutzer ggf. nicht einmal etwas markieren kann, wäre es bei deinen Anforderungen vlt. einfacher eine eigene Komponente von TGraphicControl abzuleiten und selbst zu zeichnen ... [/edit] |
Re: Tabelle und Rahmen
das unterstreicht die einträge innerhalb der jeweiligen zelle, macht aber keinen rahmen unter die komplette zeile... geht das nicht? so wie bei excel?
Zitat:
|
Re: Tabelle und Rahmen
Hallo,
Zitat:
Wenn du mit jedem Beitrag weitere Detailanforderungen zu deinem Projekt preis gibst, dann wirst du irgendwann sogar richtig brauchbare Vorschläge bzw. Hilfestellungen erhalten. Freundliche Grüße |
Re: Tabelle und Rahmen
ok, also ich versuche nochmal zusammen zu fassen:
ich möchte einen taschenrechner nachbilden, es gibt einmal ein feld wo die aktuell eingegebene zahl angezeigt wird und mit dem auch gerechnet wird, außerdem soll der rechner ein anzeigefeld haben, bestehend aus 3 spalten, die erste soll für evtl. texteingaben, nähere bezeichnungen des jeweiligen rechenschritts sein, die zweite und die dritte für ein zwischenergebnis und die zwischensumme, heißt also dass man in der ersten spalte auch per klick text einfügen kann, während die beiden letzten spalten zur reinen anzeige gedacht sind, nach drücken der gleich-taste soll ein strich unter die gesamten aufsummierten zahlen gemacht werden(also über die komplette breite), nach drücken der clear-tast soll ebenfalls ein strich dargestellt werden, der allerdings dicker sein soll als der ergebnis-strich, und das ganze soll man auch so wie es angezeigt wird auch drucken können... ich hoffe das war einigermaßen verständlich und hoffentlich jetzt auch vollständig. gruß pauletta82 Zitat:
|
Re: Tabelle und Rahmen
Zitat:
Delphi-Quellcode:
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); var R: TRect; begin With (Sender as TListView).Canvas do begin R := Item.DisplayRect(drBounds); MoveTo(R.Left, R.Bottom - 1); LineTo(R.Right, R.Bottom - 1); end; end; |
Re: Tabelle und Rahmen
der ansatz ist gut, die linie wird auch gezeichnet an der richtigen stelle, aber es tritt noch folgendes problem auf:
die linie wird erst gezeichnet wenn ich mit der maus über die entsprechende zeile scrolle, wenn ich diese zeile dann anklicke und danach eine andere zeile anklicke, ist die linie unter der ersten zeile auf einmal wieder weg, sie wird erst dann wieder neu gezeichnet wenn ich wieder mit der maus darüber scrolle... ich hab schon eine ganze menge ausprobiert und versucht, aber bekomme das problem nicht in den griff, irgendwie wird diese erste linie zwischenzeitlich überschrieben, in welcher reihenfolge wird denn das listview gemalt? hab auch mal mit dem status rumprobiert, aber nichts passendes gefunden, gibt es keinen "allgemeinen" status, der immer ausgeführt wird?? begin With (Sender as TListView).Canvas do begin R := Item.DisplayRect(drBounds); MoveTo(R.Left, R.Bottom - 1); LineTo(R.Right, R.Bottom - 1); end; end;[/delphi][/quote] |
Re: Tabelle und Rahmen
Zitat:
|
Re: Tabelle und Rahmen
Ich habe Mittagspause und nix anderes zu tun wie es schein :mrgreen:
ListView.ViewStyle := vsReport;
Delphi-Quellcode:
Funktioniert bei mir wunderbar :P ...
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); var R: TRect; begin If Stage = cdPostPaint then With Sender as TListView do begin R := Item.DisplayRect(drBounds); Canvas.MoveTo(R.Left, R.Bottom - 1); Canvas.LineTo(R.Right, R.Bottom - 1); end; end; |
Re: Tabelle und Rahmen
hallo,
soweit war ich auch schon, aber leider hats immer noch nicht geklappt, hab noch immer dasselbe problem: "...die linie wird erst gezeichnet wenn ich mit der maus über die entsprechende zeile scrolle, wenn ich diese zeile dann anklicke und danach eine andere zeile anklicke, ist die linie unter der ersten zeile auf einmal wieder weg, sie wird erst dann wieder neu gezeichnet wenn ich wieder mit der maus darüber scrolle... " nochmal zur klarstellung: die linie soll genau dann gezeichnet werden, wenn ich die "Gleich"-Taste drücke, und sie soll unabhängig von irgendwelchen mausbewegungen gezeichnet werden und auch nicht wieder entfernt werden wenn ich eine zeile markiere... Zitat:
|
Re: Tabelle und Rahmen
Zitat:
Der Fehler muss wohl bei dir oder deinem Delphi liegen :stupid: Welche Version nutzt du eigentlich? Du wirst ja sicherlich etwas mehr Code haben als diesen Schnipsel, vlt. "zerstörst" du damit den reibungslosen Ablauf?! PS: Zum testen kannst du ja ein neues Projekt anfangen und erstmal nur das Zeichnen der Linie testen. Wenn dies geht weißt du, dass der Fehler in dem Programm liegen wird ... |
Re: Tabelle und Rahmen
ich benutze delphi 2007... oder ob es daran liegt???
[...PS: Zum testen kannst du ja ein neues Projekt anfangen und erstmal nur das Zeichnen der Linie testen. Wenn dies geht weißt du, dass der Fehler in dem Programm liegen wird ...[/quote] |
Re: Tabelle und Rahmen
Zitat:
Geht denn das Zeichnen der Linie, wenn du mal ein komplett neues Projekt nur zum testen anfängt? Wenn ja, poste doch mal etwas von deinem Code, vlt. wird dort ja ein Fehler ersichtlich :wink: |
Re: Tabelle und Rahmen
hab ein neues projekt erstellt und den code entsprechen reinkopiert, leider immer noch derselbe fehler... hier mein test-coding aus dem "leeren" projekt:
procedure TForm1.FormCreate(Sender: TObject); var NewItem: TListItem; begin //zum Probieren für das ListView -->später löschen //Vorab-Definitionen lsvBand.ViewStyle := vsReport; lsvBand.RowSelect := True; //Füllen der ListView NewItem := lsvBand.Items.Add; //Zeile erzeugen (Item 0) NewItem.Caption := '4711'; //Item 0, Caption NewItem.SubItems.Add('Hallo'); //Item 0, SubItem 0 NewItem.SubItems.Add('Hallo'); //Item 0, SubItem 1 NewItem.SubItems.Add('Hallo'); //Item 0, SubItem 2 NewItem := lsvBand.Items.Add; //nächste Zeile erzeugen NewItem.Caption := '4712'; NewItem := lsvBand.Items.Add; //nächste Zeile erzeugen NewItem.Caption := '4713'; NewItem := lsvBand.Items.Add; //nächste Zeile erzeugen NewItem.Caption := '4714'; NewItem := lsvBand.Items.Add; //nächste Zeile erzeugen NewItem.Caption := '4715'; //Zellen überschreiben // Zeile Spalte lsvBand.Items[2].Caption := 'tttt'; lsvBand.Items[0].SubItems[0] := 'kiki' ; end; procedure TForm1.lsvBandAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); var rechteck: TRect; begin with lsvBand.Canvas do begin // If Stage = cdPostPaint then With Sender as TListView do begin //zeichnet eine Linie unterhalb der Zeile "Item" rechteck := Item.DisplayRect(drBounds); MoveTo(rechteck.Left, rechteck.Bottom-1); LineTo(rechteck.Right, rechteck.Bottom-1); end; //Abfrage ob Eintrag markiert if cdsSelected in State then begin font.Color := clwhite; end end; end; [...Gut zu wissen. Ich habe "nur" D2006 ... Geht denn das Zeichnen der Linie, wenn du mal ein komplett neues Projekt nur zum testen anfängt? Wenn ja, poste doch mal etwas von deinem Code, vlt. wird dort ja ein Fehler ersichtlich :wink:[/quote] |
Re: Tabelle und Rahmen
Zitat:
Evtl. testet ein netter Forumsnutzer das noch mal für uns?! ^^ |
Re: Tabelle und Rahmen
ein kollege von mir hats grad getestet, er verwendet auch delphi 2006, aber bei ihm tauchen die selben probleme auf wie bei mir...
Zitat:
|
Re: Tabelle und Rahmen
Liste der Anhänge anzeigen (Anzahl: 2)
:shock: Ich bin zwar blöd, aber so blöd nun auch net ...
Im Anhang mal das Projekt und ein Bild wie es bei mir aussieht ... wenn das bei D2006 nicht geht, muss mein D2006 wohl anders sein :wall: |
Re: Tabelle und Rahmen
juhuu, es funktioniert endlich!!! :dancer:
genau so wie du das hattest wollt ich das haben! also es lag weder am delphi2006 noch am listview selbst, sondern daran dass ich die eigenschaft "gridlines" des listview auf true stehen hatte, sie muss aber in diesem falle zwingend auf "false" stehen, dadurch hats dann zum geschilderten problem geführt :wall: vielen vielen dank deap sea!! du hast mir sehr geholfen! :hello: Zitat:
|
Re: Tabelle und Rahmen
ich muss nochmal zu einem anderen problem nachhaken und die frage nochmal aufgreifen:
wann wird das AdvancedCustomDrawItem-ereignis ausgelöst? und was meinst du mit "Zeichenoperation"? ich möchte die linie nur dann zeichnen nachdem ich auf den gleich-button geklickt habe... Zitat:
|
Re: Tabelle und Rahmen
Zitat:
Zitat:
1) Sollen, wenn man etwas eintippt, man "Gleich" drück, man noch mehr eintippt und wieder "Gleich" drückt, dann zwei Linien dort sein? 2) Oder immer nur an der Stelle des letzten "Gleich"? Sofern 1): Merke dir im Item der ListView (TListItem's haben dafür die Eigenschaft Data) das du immer unter diesem Item eine Linie zeichnen willst. Beim Draw-Ereignis kannst du dies auswerten ... Sofern 2): Merke dir in einer Integer-Variable den Index des Items (oder das Item selbst) unter dem du die Linie zeichnen willst. Das kannst du dann auch im Draw-Ereignis auswerten ... PS: Es gibt natürlich viele Möglichkeiten. Je nachdem wie dein Programm ablaufen soll ergeben sich bessere und schlechtere ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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-2025 by Thomas Breitkreuz