Farbanpassung je nach Wert
Farbanpassung je nach Wert
Hallo,
habe mir mein erstes kleines Programm aufgebaut, in dem ein paar Berechnungen stattfinden.
In einem Reiter will ich dann eine Komplettübersicht geben und dazu würde ich gerne bei bestimmten Werten bestimmte Bereiche in einer Grafik farbig ausgeben.
Dazu ein konkretes Beispiel:
Ich frage nach Serviceleistungen beim letzten Kundendienst. Wurde z.B. das Öl vor 10.000km gewechselt, soll in meinem Bild (das ein Auto darstellt) der Motorraum rot sein. Ist das Öl vor 5.000km gewechselt worden, soll der Bereich in der Grafik gelb sein und alles was unter 5.000 km ist bedeutet eine grüne Kennzeichnung des Bereiches.
Gleiches will ich dann auch z.B. für die Autoreifen machen.
Gibts da eine Möglichkeit? Und wenn ja, was könnt Ihr mir empfehlen?
Vielen Dank!!
McReier
habe mir mein erstes kleines Programm aufgebaut, in dem ein paar Berechnungen stattfinden.
In einem Reiter will ich dann eine Komplettübersicht geben und dazu würde ich gerne bei bestimmten Werten bestimmte Bereiche in einer Grafik farbig ausgeben.
Dazu ein konkretes Beispiel:
Ich frage nach Serviceleistungen beim letzten Kundendienst. Wurde z.B. das Öl vor 10.000km gewechselt, soll in meinem Bild (das ein Auto darstellt) der Motorraum rot sein. Ist das Öl vor 5.000km gewechselt worden, soll der Bereich in der Grafik gelb sein und alles was unter 5.000 km ist bedeutet eine grüne Kennzeichnung des Bereiches.
Gleiches will ich dann auch z.B. für die Autoreifen machen.
Gibts da eine Möglichkeit? Und wenn ja, was könnt Ihr mir empfehlen?
Vielen Dank!!
McReier
Re: Farbanpassung je nach Wert
Am besten machst du für jede Farbe ein Bild (bmp, png...) und tauschst das dann je nach Kontext aus.
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Farbanpassung je nach Wert
Vielleicht suchst du auch nach FloodFill().
Re: Farbanpassung je nach Wert
Scotty hat geschrieben:Vielleicht suchst du auch nach FloodFill().
Kann sein, würde ich aber nicht unbedingt empfehlen. Dann vllt. eher noch mit transparenten Bereichen arbeiten.
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Farbanpassung je nach Wert
Wars nich so das Floodfill nur unter Windoof funktionierte ?
oder ist das mittlerweile auf allen Plattformen verfügbar..
oder ist das mittlerweile auf allen Plattformen verfügbar..
--
Just try it
Just try it
Re: Farbanpassung je nach Wert
theo hat geschrieben:Am besten machst du für jede Farbe ein Bild (bmp, png...) und tauschst das dann je nach Kontext aus.
Hi Theo,
werde versuchen wirklich mit unterschieldichen Bilden zu arbeiten. Dumme Frage: Wie lade ich ein neues Bild genau über die Position eines vorhandenen Bildes?
Danke!
McReier
Re: Farbanpassung je nach Wert
McReier hat geschrieben:werde versuchen wirklich mit unterschieldichen Bilden zu arbeiten. Dumme Frage: Wie lade ich ein neues Bild genau über die Position eines vorhandenen Bildes?
Was verstehst du unter "Bild"? TImage?
Re: Farbanpassung je nach Wert
theo hat geschrieben:McReier hat geschrieben:werde versuchen wirklich mit unterschieldichen Bilden zu arbeiten. Dumme Frage: Wie lade ich ein neues Bild genau über die Position eines vorhandenen Bildes?
Was verstehst du unter "Bild"? TImage?
Ja, genau. Sorry für die unklare Ausdrucksweise meinerseits.
Re: Farbanpassung je nach Wert
McReier hat geschrieben:Ja, genau. Sorry für die unklare Ausdrucksweise meinerseits.
Dann verstehe ich deine Frage nicht. Die verschieden Bilder müssen natürlich deckungsgleich sein, dann muss man sie ja nur ersetzen bzw. laden.
Re: Farbanpassung je nach Wert
Beim Ersetzen von "Bildern" gibt es verschiedene Möglichkeiten der Realisierung:
1. Einfach zur realisieren aber sehr ressourcenaufwendig: für jeden möglichen Zustand ein separates Bild z.B. Motorraum weiss/gelb/rot -> 3 Bilder, die entsprechend ersetzt werden müssen.
Kommen dann aber noch die Räder hinzu, so sind das statt 3 Bilder, 9 zu erstellen (Motorraum weiss, Räder weiss / Motorraum gelb, Räder weiss / Motorraum rot, Räder weiss / Motorraum weiss, Räder gelb ...) So müsstest du für jeden möglichen Zustand 3^n Bilder erstellen!
2. Einzelbilder ersetzen: Je Zustand immer Teilbild des Autos ersetzen. Da das Auto nicht einfach in Rechtecke zerlegt werden kann, die man mit "CopyRect" übermalen kann, wirst du wahrscheinlich die Transparenz von Bildern nutzen müssen.
Generell würde ich dir empfehlen, bevor du soetwas versuchst, zu verstehen, wie mit Grafiken mit Lazarus (kannst auch Delphi zum googeln nehmen) programmiert werden kann. D.h. mal ein paar Tutorials durchzuarbeiten!
Siehe z.B.
http://volker-berg.de/Diff9/zeichnen.htm
http://wiki.freepascal.org/Developing_with_Graphics/de
1. Einfach zur realisieren aber sehr ressourcenaufwendig: für jeden möglichen Zustand ein separates Bild z.B. Motorraum weiss/gelb/rot -> 3 Bilder, die entsprechend ersetzt werden müssen.
Kommen dann aber noch die Räder hinzu, so sind das statt 3 Bilder, 9 zu erstellen (Motorraum weiss, Räder weiss / Motorraum gelb, Räder weiss / Motorraum rot, Räder weiss / Motorraum weiss, Räder gelb ...) So müsstest du für jeden möglichen Zustand 3^n Bilder erstellen!
2. Einzelbilder ersetzen: Je Zustand immer Teilbild des Autos ersetzen. Da das Auto nicht einfach in Rechtecke zerlegt werden kann, die man mit "CopyRect" übermalen kann, wirst du wahrscheinlich die Transparenz von Bildern nutzen müssen.
Generell würde ich dir empfehlen, bevor du soetwas versuchst, zu verstehen, wie mit Grafiken mit Lazarus (kannst auch Delphi zum googeln nehmen) programmiert werden kann. D.h. mal ein paar Tutorials durchzuarbeiten!
Siehe z.B.
http://volker-berg.de/Diff9/zeichnen.htm
http://wiki.freepascal.org/Developing_with_Graphics/de
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Farbanpassung je nach Wert
Hallo zusammen,
habe mich (gezwungendermaßen) nun für die Variante 1 entschieden, da die für einen Anfänger wohl das einfachste ist.
Mit der IF-Funktion habe ich nun schon nach rot,gelb und grün getrennt. Ich stehe aber nun vor dem Problem, wie ich den Ausschnitt über das Ursprungsbild bekomme. Habe folgendermaßen begonnen aber das klappt nicht:
Hat einer wieder einmal eine gute Idee??
habe mich (gezwungendermaßen) nun für die Variante 1 entschieden, da die für einen Anfänger wohl das einfachste ist.
Mit der IF-Funktion habe ich nun schon nach rot,gelb und grün getrennt. Ich stehe aber nun vor dem Problem, wie ich den Ausschnitt über das Ursprungsbild bekomme. Habe folgendermaßen begonnen aber das klappt nicht:
Code: Alles auswählen
if Pos1<5 THEN
begin
TImage.OnPictureChanged:=TImage17;
end;
Hat einer wieder einmal eine gute Idee??
Re: Farbanpassung je nach Wert
Versuche mal folgenden Code zu verstehen (will ich dir jetzt alles erklären, dann würde ich dir wieder empfehlen ein paar Tutorials durchzuarbeiten ):Bei mir macht das genau das, was du willst, ich hoffe bei dir läufts auch?!
Nochmal als Projekt, sonst fehlen dir ja die Bilder
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, IMGList;
type
{ TForm1 }
TForm1 = class(TForm)
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Image1: TImage;
ImageList1: TImageList;
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Image1Paint(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Image1Paint(Sender: TObject);
begin
case Combobox1.ItemIndex of
1:ImageList1.Draw(Image1.Canvas,13,131,0,dsTransparent,itImage,true);
2:ImageList1.Draw(Image1.Canvas,13,131,1,dsTransparent,itImage,true);
end;
case Combobox2.ItemIndex of
1:ImageList1.Draw(Image1.Canvas,133,219,2,dsTransparent,itImage,true);
2:ImageList1.Draw(Image1.Canvas,133,219,3,dsTransparent,itImage,true);
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Refresh;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
Refresh;
end;
end.
Nochmal als Projekt, sonst fehlen dir ja die Bilder
- Dateianhänge
-
- Auto.ZIP
- (274.32 KiB) 105-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Farbanpassung je nach Wert
Hallo Michl,
der Wahsinn. Unglaublich, was da alles möglich ist...
Das muss ich erst mal verdauen. Meld' mich wieder, sobald ichs gefressen habe.
DANKE!!
der Wahsinn. Unglaublich, was da alles möglich ist...
Das muss ich erst mal verdauen. Meld' mich wieder, sobald ichs gefressen habe.
DANKE!!
Re: Farbanpassung je nach Wert
Hallo Michl,
habe heute Dein Demo nachgestellt und mir sind nun schon einige Dinge etwas klarer.
Leider gibts für TImgaeList kein passendes Tutorial (als Video) das mir den endgültigen Durchblick verschafft.
Habe mir zwar ein Buch für Lazarus zugelegt (http://www.hugendubel.de/3/16700028-1/b ... origin=pla) aber ich komme mit den Videos und "Learning by doing" am besten vorwärts. Dauert halt' und man müsste wohl geduldiger sein.
Ich habe Deine Variante nun etwas modifiziert, damit mir der Aufbau etwas klarer wird. Leider geht das Programm beim kompilieren auf Fehler. Funktioniert war dann einmal aber dann ist Schluss....
Kannst Du erkennen, wo ich den Bug eingebaut habe?
Vielen Dank!
McReier
habe heute Dein Demo nachgestellt und mir sind nun schon einige Dinge etwas klarer.
Leider gibts für TImgaeList kein passendes Tutorial (als Video) das mir den endgültigen Durchblick verschafft.
Habe mir zwar ein Buch für Lazarus zugelegt (http://www.hugendubel.de/3/16700028-1/b ... origin=pla) aber ich komme mit den Videos und "Learning by doing" am besten vorwärts. Dauert halt' und man müsste wohl geduldiger sein.
Ich habe Deine Variante nun etwas modifiziert, damit mir der Aufbau etwas klarer wird. Leider geht das Programm beim kompilieren auf Fehler. Funktioniert war dann einmal aber dann ist Schluss....
Kannst Du erkennen, wo ich den Bug eingebaut habe?
Vielen Dank!
McReier
Re: Farbanpassung je nach Wert
Schreib mal im Objektinspektor bei deinem "Edit1" bei der Eigenschaft "Text" eine Zahl z.B. "1" und dein Projekt startet erst einmal.
Wie der Dubugger sagt " "" is an invalid float" -> die Umwandlung deines bisher definierten Textes "" ergibt keine gültige Zahl!
Anmerkung: Wenn du die Bilder mittels eines TEdits eingeben/ändern willst, dann würde ich dafür eine Variable nehmen, wo hinterlegt ist, welches Bild angezeigt werden soll. Damit kannst du dann immer bei einer Eingabe zuvor prüfen, ob überhaupt eine gültige Zahl eingegeben wurde, bevor du die Variable änderst! Z.B. gibt jemand "Hallo" ein, wird dein Programm immer einen Fehler verursachen, da dann kein gültiges Bild geladen werden kann!
Anmerkung2: In der ImageList ist nur noch ein Bild hinterlegt, mit DoppelKlick auf die ImageList kannst du wieder die Bilder zufügen!
Wie der Dubugger sagt " "" is an invalid float" -> die Umwandlung deines bisher definierten Textes "" ergibt keine gültige Zahl!
Anmerkung: Wenn du die Bilder mittels eines TEdits eingeben/ändern willst, dann würde ich dafür eine Variable nehmen, wo hinterlegt ist, welches Bild angezeigt werden soll. Damit kannst du dann immer bei einer Eingabe zuvor prüfen, ob überhaupt eine gültige Zahl eingegeben wurde, bevor du die Variable änderst! Z.B. gibt jemand "Hallo" ein, wird dein Programm immer einen Fehler verursachen, da dann kein gültiges Bild geladen werden kann!
Anmerkung2: In der ImageList ist nur noch ein Bild hinterlegt, mit DoppelKlick auf die ImageList kannst du wieder die Bilder zufügen!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;