Einzelnen Beitrag anzeigen

Mikko

Registriert seit: 23. Jan 2003
Ort: Baden
65 Beiträge
 
#10

Re: Suche (gute) Diagramm-Komponennte

  Alt 23. Dez 2003, 20:22
@MrKnogge
Du setzt eine Image-Kompo auf eine Form. Das AlphaBlend stellst du über dein Form ein. Damit ist dein Diagramm somit auch "durchsichtig".

Die Prozedur für den Rahmen sieht so aus:

Delphi-Quellcode:
procedure tform4.hintergrund_zeichnen;
var y:integer;
begin
form4.Image1.Repaint;
form4.image1.Canvas.Pen.Color:=clgray;
form4.image1.Canvas.Pen.style:=pssolid;
form4.image1.Canvas.Brush.Color:=$00EEE0DA;
form4.image1.Canvas.Rectangle(0,0,292,100);
form4.image1.Canvas.Pen.Color:=clblack;
form4.image1.Canvas.Rectangle(44,2,166,80);
form4.image1.Canvas.Rectangle(168,2,290,80);
form4.image1.Canvas.Font.Name:='Arial';
form4.image1.Canvas.Font.Size:=6;
form4.image1.Canvas.Font.Color:=stringtocolor(ini_farbe_dl);
form4.image1.Canvas.TextOut(27,80,'DL');
form4.image1.Canvas.Font.Color:=stringtocolor(ini_farbe_ul);
form4.image1.Canvas.TextOut(27,88,'UL');
if ini_label_raster=true then begin //Minutenraster
 form4.image1.Canvas.Pen.Color:=clgray;
 form4.image1.Canvas.Pen.style:=psDot;
 form4.image1.Canvas.Pen.Color:=clgray;
 form4.image1.Canvas.MoveTo(44+60,78);
 form4.image1.canvas.LineTo(44+60,2);
 form4.image1.Canvas.MoveTo(168+60,78);
 form4.image1.canvas.LineTo(168+60,2);
 end;
if ini_label_100=true then begin //100%-Linie
 form4.image1.Canvas.Pen.Color:=clgray;
 form4.image1.Canvas.Pen.style:=psDot;
 form4.image1.Canvas.Pen.Color:=clgray;
 y:=strtoint(floattostr(roundto(76/((form4.ini_zusatz)/100),0)));
 y:=76-y;
 form4.image1.Canvas.MoveTo(44+2,y);
 form4.image1.canvas.LineTo(44+120,y);
 form4.image1.Canvas.MoveTo(168+2,y);
 form4.image1.canvas.LineTo(168+120,y);
 end;
//Anzeige, ob Timer aktiv
if (form4.Showing=true) and ((form1.gllabel1.Visible=true) or (form1.gllabel2.Visible=true))
 then begin
 shape1.Visible:=true;
 label3.Visible:=true;
 end
 else begin
 shape1.Visible:=false;
 label3.Visible:=false;
 end;
end;
Das ist die Prozedur, um das Diagramm zu zeichnen. Diese Prozedur zeichnet je 2Linien für Up- und Download. Eine Linie in der Farbe des Graphen und die zweite, die an der ersten Linie anschließt, in der Farbe des Hintergrunds, um die Linie, die eventuell vorher da war, zu übermalen.

Delphi-Quellcode:
procedure TForm4.graph_zeichnen(d1, s1:extended; stelle:byte; speed:integer);
var linie:extended;
begin
if form4.Showing=true then begin
 //Download
 form4.image1.Canvas.Pen.style:=pssolid;
 form4.image1.Canvas.Pen.Color:=stringtocolor(ini_farbe_dl);
 form4.image1.Canvas.Pen.Width:=1;
 form4.image1.Canvas.MoveTo(44+stelle,78);
 if speed>0 then
  linie:=d1*75/((speed)/(1024*8))
  else
  linie:=0;
 linie:=roundto(linie*1/((ini_zusatz)/100),0); //variabler Zuschlag
 if linie>76 then linie:=76;
 form4.image1.canvas.LineTo(44+stelle,78-(linie));

 //Upload
 form4.image1.Canvas.Pen.Color:=stringtocolor(ini_farbe_ul);
 form4.image1.Canvas.MoveTo(168+stelle,78);
 if speed>0 then
  linie:=s1*75/((speed)/(1024*8))
  else
  linie:=0;
 linie:=roundto(linie*1/((ini_zusatz)/100),0); //variabler Zuschlag
 if linie>76 then linie:=76;
 form4.image1.canvas.LineTo(168+stelle,78-(linie));
end;
end;
Gespeist wird diese Prozedure von folgendem Code, der bei mir jetzt in einer anderem Form steht und von einem Timer aufgerufen wird:

Delphi-Quellcode:
i:=120;
repeat
 r[i]:=r[i-1];
 s[i]:=s[i-1];
 geschw[i]:=geschw[i-1];
 dec(i);
until i=0;
r[1]:=roundto(((down)/1024),-2);
s[1]:=roundto(((up)/1024),-2);
geschw[1]:=speed;
if (form4.Showing=true) then begin
 form4.hintergrund_zeichnen;
 for i:=1 to 120 do
  form4.graph_zeichnen(r[i],s[i],i,geschw[i]); //Graph zeichnen
Zuerst werden die ankommenden Daten in ein Array gelesen. Danach wrd das Array um eine Stelle verrückt (>Vorrücken des Graphen). Dann wird die Prozedure graphzeichnen für jedes Element aufgerufen. Als letztes habe ich jetzt noch eine Stringbearbeitung drin, die hier aber nicht interessiert (es sollen auf alle Fälle immer 2 Nachkommastellen stehen).


So, das ist der ganze Code. Den mußt du nur auch deine Bedürfnisse umbiegen.

Zur Info: Der DU-Meter-Clone ist noch in Bearbeitung. Daher keine Gewähr für Fehler, besonders schönen Code etc.
  Mit Zitat antworten Zitat