Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Skala an Komponente (https://www.delphipraxis.net/177514-skala-komponente.html)

Chris211183 11. Nov 2013 11:34

Skala an Komponente
 
Hallo Delphianer,

ich möchte an meiner Komponente an der linken Seite eine Messskala haben, wobei ich nicht genau weiß, wie ich das jetzt am Dümmsten anstellen soll, kann...
jemand einen Tip ?


Delphi-Quellcode:
type
THixBargraphKind = (sbHorizontal, sbVertical);
 THixBarGraphLabelingOrientation = (lboAbove, lboBelow, lboLeft, lboright);


private
FKind : THixBarGraphKind;
FLabelingStyle : ThixBarGraphLabelingStyle;
procedure SetKind(const Value: THixBarGraphKind);
procedure SetLabellingStyle(const Value: ThixBarGraphLabelingStyle);

published
property LabellingStyle : THixBarGraphLabelingStyle read FLabellingStyle write SetLabellingStyle;
Property LabelingFont : TFont read FLabelingFont write SetLabelingFont;

….....

implementation

…....
destructor THixBarGraph.Destroy;
begin
  inherited Destroy;
end;

procedure THixBarGraph.Paint;
var
   R: TRect;

begin
  inherited;
  if (Parent = NIL) or not visible
  then Exit;

  case FKind of

      sbHorizontal :
          R := Rect(OffsetUpper,
                   (Height - Barwidth) div 2,
                    Width - OffsetLower,
                   (Height + Barwidth) div 2);

      sbVertical :
          R := Rect((Width - BARWIDTH) div 2,
                     Height - (Height - OffsetUpper),
                     (Width + BARWIDTH) div 2,
                     Height - OffsetLower);
          end;

                 Canvas.Brush.Color := FColor;
                 Canvas.FillRect(Rect(0, 0, Width, Height));
                 Canvas.Brush.Color := FBarColor;
                 Canvas.FillRect(R);
                 Frame3D(Canvas, R, clBtnShadow, clBtnHighlight, 1);
end;

procedure THixBarGraph.SetKind(const Value: THixBarGraphKind);
begin
   if FKind <> Value
   then
   begin
       FKind := Value;
       invalidate;
   end;
end;

procedure THixBarGraph.SetOffsetLower(const Value: Integer);
begin
   if FOffsetLower <> Value
   then
     begin
       FOffsetLower := Value;
       invalidate;
     end;

end;

procedure THixBarGraph.SetOffsetUpper(const Value: Integer);
begin
   if FOffsetUpper <> Value
   then
     begin
       FOffsetUpper := Value;
       invalidate;
     end;

end;

Furtbichler 11. Nov 2013 14:20

AW: Skala an Komponente
 
Zitat:

Zitat von Chris211183 (Beitrag 1235392)
wie ich das jetzt am Dümmsten anstellen soll, kann...
jemand einen Tip ?

Der dümmste Tip, der mir einfällt, ist: Implementiere das in der Paint-Methode.

Im Ernst: Was für eine Skala? Wann soll sie gezeichnet werden? Oder meinst Du eine Achsenbeschriftung mit Achseneinteilung etc.?

Chris211183 11. Nov 2013 14:27

AW: Skala an Komponente
 
genau das !


Ich beschreib mein Problem mal genauer :wink:


Es geht jetzt darum, dass ich verschiedene Skalenbereiche für den Graphen haben möchte, quasi Linien, Zahlen, beides zusammen, etc...
Diese Wertebereiche sollen Variabel sein, möchte ich mit Value, ValueMin und ValueMax definieren vom Rückgaberwert Double.
Nun könnte ich ja Canvas.LineTo benutzen (was nur Integer zurück gibt), desweiteren, soll das ganze ja aber auch bei horizontaler und verticaler Ansicht von der Komponente passen..., stehe hier voll auf dem Schlauch, Ideen sind da, nur an der Umsetztung haperts seid nen paar Tagen :oops:

Furtbichler 11. Nov 2013 14:36

AW: Skala an Komponente
 
Ah.
Je eine Routine zum Zeichnen der Skala links, rechts, oben bzw. unten. Kann man alles in einer Routine machen, wird aber unübersichtlich. Mit der Zeichenroutine hast Du auch gleich die Abmessungen des Bereichs (also dort, wie die Beschriftungen etc. hinsollen) bzw. legst diese Fest. Beispielsweise ergibt sich die Breite einer vertikalen Skala mit Beschriftung aus der Breite des längsten Labels + Zwischenraum + Majortick-Länge.

Und wenn Du das dann schon hast (Also die Abmessungen), ergibt sich der Rest fast von alleine.

Du kannst ja zuerst die Achsen einzeichnen und in den Routinen die Breite/Höhe bestimmen (brauchst Du ja zum Zeichnen). Wenn Du dann den Grafikbereich zeichnen willst, hast Du schon den Offset links/rechts/oben/unten.

Die Problematik 'Float=>Integer' bekommst Du ja mit nem Dreisatz hin: X-Pixel = x-linker-Offset + (X-xMin)/Breite-Grafikbereich-in-Pixel

Chris211183 11. Nov 2013 14:45

AW: Skala an Komponente
 
wow :?, ja an der Mathematik solls nicht hapern, an der Implementation ehr...

hast Du irgendwie nen Beispiel, wie und wo man das am einfachsten macht ?
wäre es dann besser, anstatt der Case of- Anweisung mit if/Else zu arbeiten ?

Furtbichler 11. Nov 2013 18:38

AW: Skala an Komponente
 
Zitat:

Zitat von Chris211183 (Beitrag 1235421)
wäre es dann besser, anstatt der Case of- Anweisung mit if/Else zu arbeiten ?

Du hast Probleme :-D Erstmal zum laufen bringen. Hübsch kann es dann immer noch werden.

Chris211183 11. Nov 2013 19:02

AW: Skala an Komponente
 
ja da hast Du Recht :P, wie mit den Frauen so´n Quellcode :pale: (an alle Feministinnen, es ist ein Spaß !!!)

ne geht einfach nur darum, dass da links Striche dran sein sollen erstmal und immer im gleichen Abstand, (theoretisch is das kein Ding, bloß Praktisch ist der Chris da überfordert, weil ihm da ein paar Jahre Delphi fehlen), der Compiler weißt mich immer wieder darauf hin, dass das kein C++ ist:stupid:, was ich auch weiß...

erstmal nur Striche am linken rand über lbsLines in der Paint-Methode an BEIDEN sbVertical und sbHorizontal..., ich fang hier bald an zu trinken...

programmieren, macht ganz schnell, verdammt alt :cheers:

stahli 11. Nov 2013 20:20

AW: Skala an Komponente
 
Mal ein Tipp:

- erst mal EINE Linie horizontal zeichnen
- dann abhängig von der Ausrichtung horizontal oder vertikal
- dann mehrere Linien

Also heran tasten sozusagen.

Dann kannst Du bei Problemen auch gezielter bzw. genauer nachfragen und wir können besser helfen.

Bei Deinen Fragestellungen wären auch Screenshots sinnvoll, was Du schon hast und Skizzen, was Du brauchst.

Chris211183 12. Nov 2013 10:46

AW: Skala an Komponente
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay, im Anhang ein Screenshot, links meine derzeitige Komponente, rechts, wie sie mal aussehen soll...

stahli 12. Nov 2013 11:23

AW: Skala an Komponente
 
Also ich versuche es mal:
- Left, Right, Top, Bottom für den Skalenbereich berechnen (optisch vorerst mit Rect zeichnen kontrollieren)
- Abstand festlegen
- Schleife Y von Top bis Bottom mit Abstand durchlaufen
- Linie zeichnen von Left/Y->Right/Y

Wo es klemmt, nochmal nachfragen.
Wenn Du die Sache strukturiert und überlegt angehst, dann sollte das schon klappen...

Chris211183 12. Nov 2013 11:46

AW: Skala an Komponente
 
Delphi-Quellcode:
begin
  inherited;
  if (Parent = NIL) or not visible
  then Exit;

  case FKind of

      sbHorizontal : begin
          R := Rect(OffsetUpper,
                   (Height - Barwidth) div 2,
                    Width - OffsetLower,
                    (Height + Barwidth) div 2);
                          if FLabelingStyle = lbsLines
                          then
                             begin
                             Canvas.Pen.Color := clBlack;
                             Canvas.LineTo(OffsetUpper,(Height - Barwidth)div 2);
                             end;
                     end;
so in etwa ?

stahli 12. Nov 2013 12:00

AW: Skala an Komponente
 
Das weiß ich nicht. Ich kenne Deine Variablen ja nicht.
Funktioniert es denn?

Noch ein Tipp:
Formatiere Deinen Quelltext konsequent ordentlich. Achte auf Groß- und Kleinschreibung. Benutze Klammern bei logischen Ausdrücken.

Das ist zwar für den Compiler nicht wichtig, aber wenn man Deinen Quelltext verstehen will macht das viel aus.

zeras 12. Nov 2013 12:21

AW: Skala an Komponente
 
Wenn ich das so lese, dann willst du vielleicht Graphen darstellen???
Dazu benutze ich die Chart Kompos von TMS http://www.tmssoftware.com/site/advchart.asp. Die kosten zwar Geld, aber so kann man sich beim Programmieren auf die "wichtigen" Dinge konzentrieren und nicht das Rad neu erfinden, was andere schon erfunden haben.
Aber vielleicht willst du auch was ganz anderes darstellen, dann nützen dir die Kompos nichts.

Chris211183 12. Nov 2013 12:26

AW: Skala an Komponente
 
ne will das ja in meiner Komponente eigenständig haben !


Delphi-Quellcode:
constructor THixBarGraph.Create(AOwner: TComponent);
 ValueMin := 0,0;
 ValueMax := 100,0



procedure THixBarGraph.Paint;
var
   R: TRect;
   Value, ValueMin, ValueMax : Double;
begin
  inherited;
  if (Parent = NIL) or not visible
  then Exit;

  case FKind of

      sbHorizontal : begin
          R := Rect(OffsetUpper,
                   (Height - Barwidth) div 2,
                    Width - OffsetLower,
                    (Height + Barwidth) div 2);
                          if FLabelingStyle = lbsLines
                             then
                                 begin
                                    Canvas.Brush.Color := FColor;
                                    Canvas.FillRect(Rect(0, 0, Width, Height));
                                    Canvas.Brush.Color := FBarColor;
                                    Canvas.FillRect(R);
                                    Frame3D(Canvas, R, clBtnShadow, clBtnHighlight, 1);
                                    Canvas.Pen.Color := clBlack;
                                    Canvas.LineTo();
                                 end;
ich komm nicht weiter, malt mir nix, egal was ich für Koordinaten setzt....

baumina 12. Nov 2013 12:30

AW: Skala an Komponente
 
Irgendwie habe ich den Eindruck, dass wir dir deine komplette Komponente schreiben :-D

Chris211183 12. Nov 2013 12:33

AW: Skala an Komponente
 
irgendwie habe ih den Eindruck, dass du ein bissl unentspannt bist :witch:

wenn sie mal fertig sein sollte, hau ich die auch hier rein, damit andere Anfänger dass dann haben !
Wie soll ich mit nen paar Wochen, ohne Hilfe ne komplette Komponente sonst schaffen ?

stahli 12. Nov 2013 13:06

AW: Skala an Komponente
 
Das Problem ist, dass Du die Sache falsch (zu unstrukturiert und zu unüberlegt) angehst und keine konkreten Fragen stellst.

So wirst Du wenig Hilfe erhalten und schwer zum Ziel komme.
Baumina wird das ähnlich gemeint haben und bisher habe ich sie eigentlich hier immer entspannt erlebt. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:01 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