Farbanpassung je nach Wert

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Farbanpassung je nach Wert

Beitrag von McReier »

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Farbanpassung je nach Wert

Beitrag von theo »

Am besten machst du für jede Farbe ein Bild (bmp, png...) und tauschst das dann je nach Kontext aus.

Scotty
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

Beitrag von Scotty »

Vielleicht suchst du auch nach FloodFill().

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Farbanpassung je nach Wert

Beitrag von theo »

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.

Benutzeravatar
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

Beitrag von corpsman »

Wars nich so das Floodfill nur unter Windoof funktionierte ?

oder ist das mittlerweile auf allen Plattformen verfügbar..
--
Just try it

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Farbanpassung je nach Wert

Beitrag von McReier »

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

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Farbanpassung je nach Wert

Beitrag von theo »

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?

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Farbanpassung je nach Wert

Beitrag von McReier »

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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Farbanpassung je nach Wert

Beitrag von theo »

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.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Farbanpassung je nach Wert

Beitrag von Michl »

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

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Farbanpassung je nach Wert

Beitrag von McReier »

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:

Code: Alles auswählen

if Pos1<5 THEN
   begin
     TImage.OnPictureChanged:=TImage17;
   end;


Hat einer wieder einmal eine gute Idee??

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Farbanpassung je nach Wert

Beitrag von Michl »

Versuche mal folgenden Code zu verstehen (will ich dir jetzt alles erklären, dann würde ich dir wieder empfehlen ein paar Tutorials durchzuarbeiten :roll: ):

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

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Farbanpassung je nach Wert

Beitrag von McReier »

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

McReier
Beiträge: 48
Registriert: Sa 17. Aug 2013, 11:35

Re: Farbanpassung je nach Wert

Beitrag von McReier »

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....
Test-Auto.zip
Auto-optimiert-mit-Bug
(206.47 KiB) 90-mal heruntergeladen

Kannst Du erkennen, wo ich den Bug eingebaut habe?
Vielen Dank!
McReier

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Farbanpassung je nach Wert

Beitrag von Michl »

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!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten