Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Design von visuellen Objekten ändern (https://www.delphipraxis.net/56895-design-von-visuellen-objekten-aendern.html)

Masterj44 12. Nov 2005 22:32


Design von visuellen Objekten ändern
 
Hallo,
ich wollt wissen wie man z.B. die farbe und design von objekten ändern kann.
Also als Beispiel: Ich benutze ein listbox und möchte die scrollbar an der seite verändern, eigentlich möchte ich es mit einem bild füllen, doch mir würde es auch reichen wenn ich weiß wie man die Farbe änder kann.

Ich hoffe ihr könnt mir weiter helfen.

3_of_8 12. Nov 2005 22:44

Re: Design von visuellen Objekten ändern
 
AFAIK benutzt das einen API Aufruf, und da kannst du nicht so einfach die Farbe ändern. Dazu musst du schon eine eigene Klasse basteln.

Masterj44 12. Nov 2005 22:51

Re: Design von visuellen Objekten ändern
 
Heißt das ich muss eine eigene Listbox erstellen?
Ich kenn mich da nicht so gut aus,
wie Aufwändig ist es denn ne eigene Klasse zu schreiben?
Ich will ja nur die scrollbar an der seite verändern,
gibt es da eine möglichkeit die klasse zu kopieren oder so was.

glkgereon 12. Nov 2005 22:53

Re: Design von visuellen Objekten ändern
 
Zitat:

Zitat von Masterj44
Heißt das ich muss eine eigene Listbox erstellen?
Ich kenn mich da nicht so gut aus,
wie Aufwändig ist es denn ne eigene Klasse zu schreiben?
Ich will ja nur die scrollbar an der seite verändern,
gibt es da eine möglichkeit die klasse zu kopieren oder so was.

du müsstest deine Klasse von der TListBox ableiten und das OnPaint überschreiben.

Delphi-Quellcode:
type
  TMyListBox = class(TListBox)
  public
    procedure RePaint; override;
  end;

implementation

procedure TMyListBox.RePaint; override;
begin
  inherited RePaint;
  Self.Canvas.Rectangle(Width-20,0,Width,Height);
end;
Das sollte so in etwa gehen...
Die 20 steht hier für die Breite des ScrollBalkens

3_of_8 12. Nov 2005 22:57

Re: Design von visuellen Objekten ändern
 
Ja, das ist SEHR aufwendig.

Du musst halt Ereignisse, Eigenschaften, Methoden usw. definieren.

Aber du kannst ja auch mal schauen, ob du irgendwo ne fertige Koponente findest.

Masterj44 12. Nov 2005 23:04

Re: Design von visuellen Objekten ändern
 
Oh, gut Ich dachte schon ich muss ein neues Objekt erstellen.


Und wie macht man das, dass sich (das Bild) wie der scrollbalken
bewegt.

Bevor ich es noch vergesse:

Danke glkgereon, dass du so schnell antworten konntest,
hätte nicht gedacht das so schnell geht.

3_of_8 12. Nov 2005 23:07

Re: Design von visuellen Objekten ändern
 
Du musst per API herausfinden, wie weit die Scrollbox gescrollt ist und maximal gescrollt werden kann, und nach diesen Werten dann einen Scrollbalken zeichnen.

glkgereon 12. Nov 2005 23:10

Re: Design von visuellen Objekten ändern
 
Zitat:

Zitat von Masterj44
Oh, gut Ich dachte schon ich muss ein neues Objekt erstellen.


Und wie macht man das, dass sich (das Bild) wie der scrollbalken
bewegt.

Ui, hier wird es etwas komplexer :)

Ehrlich gesagt weiss ich gar nicht ob das geht.
afaik wird die Listbox doch mithilfe eines WinApi-Typs erzeugt...Und da an Werte wie zB die Position des ScrollBalkens dranzukommen....Keine Ahnung
Ich räume mal das Feld, für unsre Spezialisten :)

Mein Code da oben kann nur was drüberzeichnen ;)

3_of_8 12. Nov 2005 23:11

Re: Design von visuellen Objekten ändern
 
Das geht irgendwie mit ListBox.Perform. Ich wühl mal kurz in alten Beiträgen.

Masterj44 12. Nov 2005 23:13

Re: Design von visuellen Objekten ändern
 
u nd wie macht man das :?

3_of_8 12. Nov 2005 23:20

Re: Design von visuellen Objekten ändern
 
Ich bin mir nicht sicher, ob das geht:

Delphi-Quellcode:
procedure TMyListbox.Repaint; override;
var Pnt: TPoint;
begin
inherited Repaint;
Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt));
Canvas.Brush.Color:=clSkyBlue;
Canvas.rectangle(Width-10,0,Width,Height);
Canvas.Brush.Color:=clBlue;
//In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht.
end;

faux 12. Nov 2005 23:23

Re: Design von visuellen Objekten ändern
 
Zitat:

Zitat von 3_of_8
Ja, das ist SEHR aufwendig.

Du musst halt Ereignisse, Eigenschaften, Methoden usw. definieren.

Aber du kannst ja auch mal schauen, ob du irgendwo ne fertige Koponente findest.

Oder man benutzt eine Erfindung die Vererbung heißt... :mrgreen:

glkgereon 12. Nov 2005 23:27

Re: Design von visuellen Objekten ändern
 
Zitat:

Zitat von 3_of_8
Ich bin mir nicht sicher, ob das geht:

Delphi-Quellcode:
procedure TMyListbox.Repaint; override;
var Pnt: TPoint;
begin
inherited Repaint;
Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt));
Canvas.Brush.Color:=clSkyBlue;
Canvas.rectangle(Width-10,0,Width,Height);
Canvas.Brush.Color:=clBlue;
//In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht.
end;

Also wenn das geht, dann bräuchte man das nur noch abzuwandeln...

Delphi-Quellcode:
procedure TMyListbox.Repaint; override;
var Pnt: TPoint;
    H: Integer;
begin
inherited Repaint;
H:=Round( Height / Count * (Height / ItemHeight)); //Höhe des Scrollbalkens. Richtig?
Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt));
Canvas.Brush.Color:=clSkyBlue;
Canvas.Rectangle(Width-10,Pnt.Y,Width,Pnt.Y+H);
Canvas.Brush.Color:=clBlue;
//In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht.
end;

3_of_8 12. Nov 2005 23:29

Re: Design von visuellen Objekten ändern
 
Ja, so könnte es gehen.

Masterj44 13. Nov 2005 10:28

Re: Design von visuellen Objekten ändern
 
Sorry das ich nicht frühere antworten konnte war gestern so müde.

Ich habe jetzt das ausprobiert was hier steht, doch Delphi erkennt
die Anweisung 'override' nicht und meint das 'EM_GETSCROLLPOS' ein undefinierter Bezeichner ist.

Hier der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TMyListBox = class(TListBox)
  public
    procedure RePaint; override;
  end;
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TMyListbox.Repaint;override;
var Pnt: TPoint;
    H: Integer;
begin
inherited Repaint;
H:=Round( Height / Count * (Height / ItemHeight)); //Höhe des Scrollbalkens. Richtig?
Perform(EM_GETSCROLLPOS, 0, Integer(@Pnt));
Canvas.Brush.Color:=clSkyBlue;
Canvas.Rectangle(Width-10,Pnt.Y,Width,Pnt.Y+H);
Canvas.Brush.Color:=clBlue;
//In Pnt.Y steht drin, wie weit das Teil gescrollt ist. Aber wie der Rest gezeichnet wird, weiß ich //nicht.
end;
end.

Khabarakh 13. Nov 2005 10:35

Re: Design von visuellen Objekten ändern
 
Repaint sorgt nur dafür, dass das Control neugezeichnet wird. Du musst die WM_PAINT-Message abfangen.

Masterj44 13. Nov 2005 10:38

Re: Design von visuellen Objekten ändern
 
ich kenn mich da nicht so gut aus kans5t du es näher beschreiben :oops:

Masterj44 13. Nov 2005 10:44

Re: Design von visuellen Objekten ändern
 
Ah, :idea: ich glaub du meinst EM_GETSCROLLPOS durch WM_PAINT ersetzen
oder ist es ganz falsch?

Ich habs mal aus probiert aber es geht gar nicht, den er erkennt
die override anweisung nicht.

hanselmansel 13. Nov 2005 10:50

Re: Design von visuellen Objekten ändern
 
HiHo,

Was du derzeit versuchst zu machen ist, die Repaint-Prozedur einer Listbox zu überschreiben. Khabar... der mit dem unbeschreiblichen Namen sagt, dass du aber auf die Windows-Message WM_PAINT (Forensuche) reagieren solltest. Mit deinem jetzigen Code hat das eher weniger zu tun.

MfG,

hanselmansel

Masterj44 13. Nov 2005 11:43

Re: Design von visuellen Objekten ändern
 
ich habe jetzt gesucht und auch einieges gefunden doch nichts was mir weiter hilft, wie fängt man die Wm_paint messages ab.

3_of_8 13. Nov 2005 11:45

Re: Design von visuellen Objekten ändern
 
Ich glaube so:

procedure OnPaint; message WM_PAINT;

(Weiß ich aber nicht genau.)

Masterj44 13. Nov 2005 11:52

Re: Design von visuellen Objekten ändern
 
Kennt ihr ein tutorial zu wm_paint, wo alles schritt für schritt erklärt ist.

Denn ich glaub ich bin nicht der einzige der das Design der objekte ändern möchte. :roll:

Und es würde mir weiter helfen den ich kenn mich nicht mit Delphi nicht so gut aus (Grundlagen ausgeschlossen).

3_of_8 13. Nov 2005 11:54

Re: Design von visuellen Objekten ändern
 
Dann fängst du mit sowas kompliziertem an? Nimm halt fürs erste lieber die VCL-Listbox her, oder muss der Scrollbalken unbedingt so aussehen?

Masterj44 13. Nov 2005 12:00

Re: Design von visuellen Objekten ändern
 
Ich will ja nicht übertreiben aber ich glaub ich kenn mich mit delphi gut genug aus jetzt mit was neues anzufangen.

Ich will ja mein wissen immer erweitern. Ich hab auch einige Programme geschrieben, doch nun will ich programme haben, die ihr eigenes Design haben.

Ich hoffe du kanst es verstehen 3_of_8

3_of_8 13. Nov 2005 12:05

Re: Design von visuellen Objekten ändern
 
Du sagtest gerade eben, du kennst dich mit Delphi noch nicht so gut aus.

Natürlich KANN ich das verstehen, aber damit DU verstehen kannst, wie das mit den Ereignissen funzt, solltest du mal versuchen, eine eigene Klasse zu schreiben. Oder du schaust dir die Beispiel-Kompos an, die Delphi dabei hat.

Khabarakh 13. Nov 2005 12:12

Re: Design von visuellen Objekten ändern
 
Um eine Windows-Botschaftsmethode zu behandeln, musst du eine Methode mit der message-Direktive deklarieren:
Delphi-Quellcode:
type
  TMyListBox = ...
  private
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
Wobei du auch die Code-Completion benutzen kannst (Strg + Space), dann musst du nur noch den Namen der Message eingeben.

Masterj44 13. Nov 2005 12:17

Re: Design von visuellen Objekten ändern
 
Ich meinte eigentlich: ich kenn mich mit delphi in verbindung mit windows nicht aus, ich weiß das es am besten ist eine eigene klasse zu estellen doch, ich glaub es ist zu aufwändig, weil ich eh nur kleinigkeiten ändern will zB. Farbe und nicht die funktionen.

Ich möcht ein programm haben das nicht wie windows aussieht,
doch die funktionen gleich sind.

Hier: Scrollbalken.

Ich habe selbst nach einem tutorial zu wmpaint gesucht, doch hab nichts gefunden.

hanselmansel 13. Nov 2005 12:21

Re: Design von visuellen Objekten ändern
 
Zitat:

Zitat von Masterj44
ich glaub es ist zu aufwändig, weil ich eh nur kleinigkeiten ändern will zB. Farbe und nicht die funktionen.

Das Problem ist, dass diese "Kleinigkeiten" von Windows gezeichnet werden. Das heisst, dass du diese Message abfangen musst, um dein eigenes Design mauell zeichnen zu können.

Masterj44 13. Nov 2005 12:24

Re: Design von visuellen Objekten ändern
 
Sendet eigentlich das prog die daten oder fordert windows sie auf?

nach dem Quelltext von Khabarakh sieht es so aus alls ob die listbox es senden würde.

3_of_8 13. Nov 2005 13:18

Re: Design von visuellen Objekten ändern
 
Die VCL-Komponenten basieren auf API Aufrufen, die Windows anweisen, an einer bestimmten Stelle deines Fensters eine Listbox zu machen.

Windows sendet dann an die Listbox ab und zu Messages (WM_PAINT, WM_SCROLLirgendwas), und in der procedure flump(var Message: TWMPaint); message WM_PAINT; wird dann darauf reagiert, wenn Windows gerade eine WM_PAINT Message an die Listbox sendet.


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