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 Tabelle und Rahmen (https://www.delphipraxis.net/103323-tabelle-und-rahmen.html)

pauletta82 14. Nov 2007 11:37


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

marabu 14. Nov 2007 11:45

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

Deep-Sea 14. Nov 2007 11:49

Re: Tabelle und Rahmen
 
Vlt. hilft dir das: http://www.swissdelphicenter.ch/de/showcode.php?id=818

Drucken wird da schon etwas komplizierter ...

Deep-Sea 14. Nov 2007 11:58

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 ...

pauletta82 14. Nov 2007 12:21

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:

Zitat von Deep-Sea
Vlt. hilft dir das: http://www.swissdelphicenter.ch/de/showcode.php?id=818

Drucken wird da schon etwas komplizierter ...


pauletta82 14. Nov 2007 12:25

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:

Zitat von marabu
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


Deep-Sea 14. Nov 2007 12:26

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]

pauletta82 14. Nov 2007 12:42

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:

Zitat von Deep-Sea
Das weiß ich ... aber du solltest ja etwas selber machen :-D

Im OnCustomDrawItem:
Delphi-Quellcode:
(Sender as TListView).Canvas.Font.Style := [fsUnderline];


marabu 14. Nov 2007 13:00

Re: Tabelle und Rahmen
 
Hallo,

Zitat:

Zitat von pauletta82
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

die laufende Aktualisierung einer HTML-Seite ist kein Problem, aber wenn du einen druckenden Tischrechner nachbilden willst, dann solltest du nicht von einer Tabelle, sondern vielleicht eher von einer Liste sprechen - und dann würde ich wohl eine ListBox verwenden.

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

pauletta82 15. Nov 2007 07:26

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:

Zitat von marabu
Hallo,

Zitat:

Zitat von pauletta82
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

die laufende Aktualisierung einer HTML-Seite ist kein Problem, aber wenn du einen druckenden Tischrechner nachbilden willst, dann solltest du nicht von einer Tabelle, sondern vielleicht eher von einer Liste sprechen - und dann würde ich wohl eine ListBox verwenden.

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


Deep-Sea 15. Nov 2007 07:43

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
[...] 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 [...]

Das hört sich nun aber sehr nach TListView an ^^ ... hier mal ein Denkanstoß:

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;

pauletta82 16. Nov 2007 08:50

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]

Deep-Sea 16. Nov 2007 09:18

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
[...] gibt es keinen "allgemeinen" status, der immer ausgeführt wird??

Die Draw-Ereignisse werden bei jeder Zeichenoperation aufgerufen. Der Status ist dazu da, um zu wissen wie du ggf. Zeichnen musst - bei deiner Linie - die unabhängig vom Status ist - kannst du den Status einfach ignorieren ...

Deep-Sea 16. Nov 2007 11:45

Re: Tabelle und Rahmen
 
Ich habe Mittagspause und nix anderes zu tun wie es schein :mrgreen:

ListView.ViewStyle := vsReport;

Delphi-Quellcode:
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;
Funktioniert bei mir wunderbar :P ...

pauletta82 19. Nov 2007 08:04

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:

Zitat von Deep-Sea
Ich habe Mittagspause und nix anderes zu tun wie es schein :mrgreen:
...
Funktioniert bei mir wunderbar :P ...


Deep-Sea 19. Nov 2007 08:12

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
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...

Das habe ich schon zur Kenntnis genommen. Aber dies kann eigentlich nicht sein, da die OnDraw Ereignisse alle beim Zeichnen kommen (logisch) und nicht erst wenn die Maus über der Zeile ist ...
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 ...

pauletta82 19. Nov 2007 08:47

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]

Deep-Sea 19. Nov 2007 08:49

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
ich benutze delphi 2007... oder ob es daran liegt???

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:

pauletta82 19. Nov 2007 08:52

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]

Deep-Sea 19. Nov 2007 09:03

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
hab ein neues projekt erstellt und den code entsprechen reinkopiert, leider immer noch derselbe fehler... hier mein test-coding aus dem "leeren" projekt:

Mhh ... tut mir leid. Vlt funktioniert es bei D2007 ja nicht. :gruebel:
Evtl. testet ein netter Forumsnutzer das noch mal für uns?! ^^

pauletta82 19. Nov 2007 09:10

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:

Zitat von Deep-Sea
Zitat:

Zitat von pauletta82
hab ein neues projekt erstellt und den code entsprechen reinkopiert, leider immer noch derselbe fehler... hier mein test-coding aus dem "leeren" projekt:

Mhh ... tut mir leid. Vlt funktioniert es bei D2007 ja nicht. :gruebel:
Evtl. testet ein netter Forumsnutzer das noch mal für uns?! ^^


Deep-Sea 19. Nov 2007 09:18

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:

pauletta82 19. Nov 2007 09:59

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:

Zitat von Deep-Sea
: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:


pauletta82 20. Nov 2007 09:52

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:

Zitat von Deep-Sea
Zitat:

Zitat von pauletta82
[...] gibt es keinen "allgemeinen" status, der immer ausgeführt wird??

Die Draw-Ereignisse werden bei jeder Zeichenoperation aufgerufen. Der Status ist dazu da, um zu wissen wie du ggf. Zeichnen musst - bei deiner Linie - die unabhängig vom Status ist - kannst du den Status einfach ignorieren ...


Deep-Sea 20. Nov 2007 10:01

Re: Tabelle und Rahmen
 
Zitat:

Zitat von pauletta82
ich muss nochmal zu einem anderen problem nachhaken und die frage nochmal aufgreifen:
wann wird das AdvancedCustomDrawItem-ereignis ausgelöst?

In der Paint-Methode der Komponente. Schau in die Delphi-Quellcodes wenn du es ganz genau wissen willst :wink:

Zitat:

Zitat von pauletta82
ich möchte die linie nur dann zeichnen nachdem ich auf den gleich-button geklickt habe...

Um das zu lösen, musst du dir natürlich irgendwie merken das du eine Linie zeichnen willst. Ist die Frage:
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 21:30 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