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 transparente Progressbar oder Text in Progressbar (https://www.delphipraxis.net/36869-transparente-progressbar-oder-text-progressbar.html)

St. Janos 27. Dez 2004 13:59


transparente Progressbar oder Text in Progressbar
 
heyho,
ich hab mal wieder ne Frage:p Und zwa: ich schreibe derzeit an einem kleinen Downloadtool. Für dieses wollte ich nun eine Fortschrittanzeige entwickeln. Habe dafür dann die TProgressbar verwendet. Klappt auch ganz gut mit dem Fortschritt anzeigen. Doch nun stoße ich auf ein Problem.
Ich wollte die Progressbar in etwa so wie die von FlashFXP (Screenshot) implementieren. Heisst, ich würde gern über oder unter dem Statusbalken Text anzeigen. Für erst genanntes dachte ich an ein TextOut, welches man vlt. an die Grafik übergeben kann. Doch weiss ich nicht wie ich auf die grafische Darstellung der Progressbar zugreifen kann?! Das wäre dann meine erste Frage:)
Für die 2 Möglichkeit ( Text unter der Progressbar ), müsste diese transparent sein. Ich hab es zwa mal geschafft über Progressbar1.Brush.Style := BsClear; den Hintergrund 'transparent' zu machen, doch leider nicht den Statusbalken. Meine 2 Frage wäre also, wie ich den Statusbalken transparent machen kann. Sollte doch irgendwie möglich sein. Hab mal mit SetBkMode(ProgressBar1.handle, TRANSPARENT); probiert. Hat aber leider garnix bewirkt. Ich habe auch gehört, das es Farbcodes für transparente Farben gibt. Doch leider weiss ich nicht wie ich diese generieren soll. Vielleicht hat da ja jmd. auch ne Ahung:)
Letzte Idee war für mich eine TGauge einzusetzen. Doch da scheiter ich leider schon beim implementieren der Komponente in das Form. Wo finde ich die TGauge überhaupt in Delphi? Wie man sieht, Fragen über Fragen. Ich hoffe, nein ich bete um eure Antwort... :hi:

fröhliche Festtage
janos

Sharky 27. Dez 2004 14:38

Re: transparente Progressbar oder Text in Progressbar
 
Hai Janos,

TGauge findest Du bei der Registerkarte "Beispiele".
Ansonsten wäre es wohl das einfachste das ganze mit einem Panel und einem TImage das auf diesem Liegt selber zu machen.
Ansatzweise so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  rec : TRect;
begin
  rec.Left := Image1.Left;
  rec.Top := Image1.Top;
  rec.Bottom := Image1.Top + Image1.Height;
  rec.Right := Image1.Width DIV 2; // 50 %

  Image1.Canvas.Brush.Color := clred;
  Image1.Canvas.Brush.Style := bsSolid;
  Image1.Canvas.FillRect(rec);
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.TextOut(Image1.Width DIV 2,Image1.Height DIV 2,'blubb');
end;

St. Janos 27. Dez 2004 17:30

Re: transparente Progressbar oder Text in Progressbar
 
hey, danke! Das mit dem selbsterstellen gefällt mir schon mal ziemlich gut.
Ich versuch grad das ganze etz aber in ne Statuspanel von einer Statusbar reinzubringen.
Leider hab ich oben immer ne weißen Rand. Der mir nicht so gut gefällt und das Bild stiecht auch ne bissel über das Statuspanel hinaus. Ne idee wie man den wegbekommt, bzw. es sauber in die Statusbar einfügen kann?:)
Aktueller Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  rec : TRect;
begin
  Image1.Parent := Statusbar1;
  Statusbar1.Perform(SB_GETRECT, 0, Integer(@rec));
  Image1.Top   := rec.Top;
  Image1.Left  := rec.Left;
  Image1.Width := rec.Right - rec.Left;
  Image1.Height := rec.Bottom - rec.Top;

  Image1.Canvas.Brush.Color := $0000FAFA;
  Image1.Canvas.Brush.Style := bsSolid;
  Image1.Canvas.FillRect(rec);
  Image1.Canvas.Brush.Style := bsClear;
  Image1.Canvas.TextOut(Image1.Width DIV 2,Image1.Height DIV 2,'blubb');
end;

grüße janos

paresy 27. Dez 2004 19:28

Re: transparente Progressbar oder Text in Progressbar
 
wenn du schon nen TRect hast kannst doch die progressbar direkt darein zeichnen ohne den umweg über das TImage zu machen

EDIT.... habs mal für die statusbar umgeschrieben

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  R, RBar : TRect;
  Position: Integer;
  Text: String;
begin

    Position := 33;
    Text := '333kb/1000kb @ 33,12kb/s';

    Statusbar1.Perform(SB_GETRECT, 0, Integer(@R));

    //progress bar
    RBar := R;

    //fit into panel
    RBar.Left := RBar.Left + 1;
    RBar.Top := RBar.Top + 1;
    RBar.Right := RBar.Right - 2;
    RBar.Bottom := RBar.Bottom - 2;

    RBar.Right := RBar.Left + Ceil( (Position / 100) * (RBar.Right - RBar.Left) );

    Statusbar1.Canvas.Brush.Color := clSkyBlue;
    Statusbar1.Canvas.FillRect(RBar);

    //progress text
    SetBkMode(Statusbar1.Canvas.Handle, TRANSPARENT);
    DrawText(Statusbar1.Canvas.Handle,
             PCHAR(Text),
             Length(Text),
             R,
             DT_SINGLELINE or DT_END_ELLIPSIS or DT_CENTER);


end;
der part mit "fit into panel" könnte man bestimmt über ne api herausfinden.... aber dafür gibts andere spezialisten.... mir fällt die funktion grad nicht ein...

grüße, paresy

St. Janos 27. Dez 2004 22:10

Re: transparente Progressbar oder Text in Progressbar
 
Wunderbar! Man dankt:) Sollte mich bei Gelegenheit vielleicht mal mehr mit TRect auseinander setzen. Anbei, jmd. ne Tutorial-Link für die Komponente?:D

Hab jetzt auch den Text skaliert. Tschuldigung, aber meine letzte Frage wäre nun noch. Bei dem über mir genannten Code verschwindet das mit FillRect und DrawText gezeichnete, sobald ich mein Form minimiere oder mal ne andere Anwendung vor den Statuspanel schiebe. Wisst ihr vielleicht woran das liegt? Wäre nett, wenn das ganze konstant nach dem zeichnen mir erhalten bleibt. Thanx to the replyer:)

ne schöööön abend noch
janos

paresy 28. Dez 2004 18:46

Re: transparente Progressbar oder Text in Progressbar
 
pack mal deinen code ins OnDrawPanel Event

Delphi-Quellcode:
procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
  const Rect: TRect);
var
  R, RBar : TRect;
  Position: Integer;
  Text: String;
begin

    Position := 33;
    Text := '333kb/1000kb @ 33,12kb/s';

  {  Statusbar1.Perform(SB_GETRECT, 0, Integer(@R)); } //braucht man nicht mehr da das event uns schon mit dem RECT versorgt

    //progress bar
    R := Rect;
    RBar := R;

    //fit into panel
    RBar.Left := RBar.Left + 1;
    RBar.Top := RBar.Top + 1;
    RBar.Right := RBar.Right - 2;
    RBar.Bottom := RBar.Bottom - 2;

    RBar.Right := RBar.Left + Ceil( (Position / 100) * (RBar.Right - RBar.Left) );

    Statusbar1.Canvas.Brush.Color := clSkyBlue;
    Statusbar1.Canvas.FillRect(RBar);

    //progress text
    SetBkMode(Statusbar1.Canvas.Handle, TRANSPARENT);
    DrawText(Statusbar1.Canvas.Handle,
             PCHAR(Text),
             Length(Text),
             R,
             DT_SINGLELINE or DT_END_ELLIPSIS or DT_CENTER);


end;
und dann beim Panel ( dort wo du z.b. den Text der angezeigt werden soll reinschreibst ) die property Style auf 'psOwnerDraw'

St. Janos 31. Dez 2004 23:22

Re: transparente Progressbar oder Text in Progressbar
 
Danke dir paresy!:) Funktioniert. Ich hab aber gemerkt, das es fast egal ist ob ich DrawPanel einsetze oder nicht. Da durch die Fortschrittsanzeige der Balken sowieso im minimalen Abstand neu gezeichnet wird. Aber trozdem danke für die Info, mehr wissen ist besser als weniger:D

frohes neues
janos


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