Delphi-PRAXiS
Seite 6 von 13   « Erste     456 78     Letzte »    

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 Benötige Hilfe beim Entwickeln einer Komponente (https://www.delphipraxis.net/98560-benoetige-hilfe-beim-entwickeln-einer-komponente.html)

torud 5. Sep 2007 20:38

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Einen Punkt meiner Wunsch und Problemliste kann ich nun doch schon FAST streichen. Und zwar gehts um den Border. Ich vermute mal, dass der Stift beim zeichnen zentriert aufgesetzt wird und habe aus dem Grund mal die X-Position um die Hälfte der BoderWidth verschoben und siehe da, wenn ich eine BorderWidth > 1 habe funzt das schon mal. Der Code, der nicht wirklich schön ist, sieht so aus - zumindest bei mir. Werde die Division vorher einmal erledigen und nicht jedesmal neu rechnen lassen und einen Klausel für die BorderWidth 1 einführen.

Delphi-Quellcode:
    //zeichnen des rahmens
    Canvas.MoveTo(0 + (BorderWidth div 2),0); //links oben
    Canvas.LineTo(myRect.Left + (BorderWidth div 2),myRect.Bottom);

    Canvas.MoveTo(0,0 + (BorderWidth div 2));
    Canvas.LineTo(myRect.Right,myRect.Top + (BorderWidth div 2));

    Canvas.MoveTo(self.Width-(BorderWidth div 2),0);  //rechts unten
    Canvas.LineTo(myRect.Right-(BorderWidth div 2),myRect.Bottom);

    Canvas.MoveTo(0,self.Height-(BorderWidth div 2)); //links unten
    Canvas.LineTo(myRect.Right,myRect.Bottom-(BorderWidth div 2));

oki 5. Sep 2007 20:56

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Hi torud,

ich bin schon ziemlich k.o. für heute, aber zum Thema Textausrichtung kann ich noch mal was beisteuern. Du übergibst in DrawText als letzten Parameter die Ausrichtungsflags.
Somit definierst du dir eine Variable vom Typ UINT und setzt diese mit MyTextForm := ersteFlag or zweitesFlag or ...
Das mit übergeben, und das wars schon.

Gruß oki

oki 5. Sep 2007 20:58

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Nachtrag,

Rahmen mit Canvas.FrameRect

Gruß

torud 5. Sep 2007 21:39

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Moin Moin Oki,

ich bin auch schon ziemlich groggy, aber hier mal mein aktueller Status.

Das mit dem Rahmen passt nun, auch wenn ich NOCH nicht mit FrameRect gemacht habe. Kommt noch.

Dann habe ich mich mal an die Ausrichtung gewagt und siehe da, es gibt einen teilweisen Erfolg.

Folgenden Code habe ich benutzt, um die Ausrichtung zur vollziehen. Dabei hatte ich dass Problem, dass ich eigentlich die bekannte Eigenschaft Layout benutzen wollte, wie sie beim TLabel zum Einsatz kommt, aber dazu war leider nichts in der Hilfe zu finden.

Delphi-Quellcode:
var
  ...
  myFirstAlignment,mySecondAlignment : Cardinal;

    //init
    myFirstAlignment := DT_CENTER;
    mySecondAlignment:= DT_VCENTER;
   
    case TextAlign of
      taCenter      : myFirstAlignment := DT_CENTER;
      taLeftJustify : myFirstAlignment := DT_LEFT;
      taRightJustify : myFirstAlignment := DT_RIGHT;
    end; //bis hierher ist alles super

    case Layout of
      tlTop         : mySecondAlignment := DT_TOP;
      tlCenter      : mySecondAlignment := DT_VCENTER;
      tlBottom      : mySecondAlignment := DT_BOTTOM;
    end; //das hier funzt noch nicht

    DrawText(self.Canvas.Handle, PChar(FText), -1, TextRect,
             myFirstAlignment or mySecondAlignment or DT_WORDBREAK);
Folgenden Code benutze ich für das Layout:
Delphi-Quellcode:
type
  TLayout = (tlTop, tlCenter, tlBottom);

private
    FLayout:TLayout;
    procedure SetTextLayout(Layout : TLayout);
published
    property Layout : TLayout read FLayout  write SetTextLayout;

procedure TmyPanel.SetTextLayout(Layout:TLayout);
begin
  If Layout = FLayout then Exit; // wenn gleicher Status nichts tun
  FLayout := Layout;             // Status abspeichern
  Invalidate;                    // Control neu zeichnen
end;
Findest Du da einen Fehler? Am liebsten wäre mir ja, wenn ich die originale Eigenschaft LAYOUT nutzen könnte, wie beim Alignment...

oki 5. Sep 2007 22:06

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Hi,

warum so kompliziert.
Delphi-Quellcode:
    case TextAlign of
      taCenter      : myAlignment := DT_CENTER;
      taLeftJustify : myAlignment := DT_LEFT;
      taRightJustify : myAlignment := DT_RIGHT;
    end;

    case Layout of
      tlTop         : myAlignment := myAlignment or DT_TOP;
      tlCenter      : myAlignment := myAlignment or DT_VCENTER;
      tlBottom      : myAlignment := myAlignment or DT_BOTTOM;
    end;
   
    IF FWordWrap then myAlignment := MyAlignment or DT_WORDBREAK;

    DrawText(self.Canvas.Handle, PChar(FText), -1, TextRect, myAlignment);
und alles ist super.

Um mal kurz auf das Thema runde Ecken zu kommen. Wie es in echt gemacht wird ist mir auch nicht bekannt. Aber such mal CombineRGN und CreateRGN hier im Forum. Da wirst du was zu Transparenz und "Durchklickbar" finden. Ich denke zu zeichnes dann deinen Rahmen mit runden Ecken und kombinierst zwei Ranges miteinander. Einer ist begrenzt durch BoundsRect, der Zweite durch deinen Rahmen. Somit wird der äußere Bereich transparent und Durchklickbar.
guckst du hier hier

Gruß oki

torud 6. Sep 2007 06:10

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Danke für den Tipp und die Einkürzung des Codes. Die Zusammenstellung ist schon ok, aber leider habe ich immer noch das Problem, dass LAYOUT nicht funktioniert. Das war auch der Grund warum ich den Aufbau in meinem vorherigen Post darlegte.

Irgendwie scheint das was nicht zu stimmen...

Den Rest mit dem Border und Deinen weiteren Hinweisen zu den abgerundeten Ecken werde ich mir nach dem jetzt stattfindenden Wocheneinkauf anschauen.

EDIT
Habe mir FrameRect angesehen und werde es wohl meiden, da es fix einen Border von einem Pixel zeichnet. So wie ich es habe bin ich flexibel und könnte es sogar dahingehend aufboren, dass man jeder Seite seine eigene Rahmenbreite zuweisen kann.

oki 6. Sep 2007 06:30

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Moin torud,

Zitat:

Zitat von torud
Habe mir FrameRect angesehen und werde es wohl meiden, da es fix einen Border von einem Pixel zeichnet. So wie ich es habe bin ich flexibel und könnte es sogar dahingehend aufboren, dass man jeder Seite seine eigene Rahmenbreite zuweisen kann.

Klar!

Bei deinem Code mit dem Layout kann ich keinen Fehler finden. Da mußt du an anderer Stelle was falsch machen. Geh mal mit dem Debugger durch den Bereich mit TextDraw und dem Setzen der attribute und sag mal was passiert.

Gruß oki

torud 6. Sep 2007 06:52

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Sorry für die Dumme Frage, aber wenn ich in der Komponente F9 drücke und mir vorher einen Stopppunkt setze, funzt das leider nicht, dass ich mir das mit dem Debugger anschauen kann, da ihm wohl noch eine Host-Anwendung fehlt => ist doch meine erste Komponente. Ich weiss es nicht besser. Was muss ich tun?

oki 6. Sep 2007 07:59

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
Hi,

kein Problem.
Eine Compo alleine kannst du nicht debuggen. Ist ja imho nur ne Unit (+Pakage). Du mußt dir eine kleine Testanwendung schreiben. einfach neue Anwendung und deine neue Compo auf der Form platzieren. Dann öffnest du deine Unit (der Compo), compilierst das Projekt und setzt den Brakepoint. Dann anwendung starten. Da dein Brakepoint in der Paint-methode steckt, wird er natürlich sofort angesprungen. Also am Besten Anwendung starten und dann Brakepoint setzen. immer wenn du deine Form in den Vordergrund bringst, schlägt der Debugger zu. Du kannst ja auch Variablen auswerten usw.

Wenn du weitere Fragen hast, keine Scham; her damit.

Gruß oki

torud 6. Sep 2007 08:50

Re: Benötige Hilfe beim Entwickeln einer Komponente
 
So ich habe es so gemacht, wie Du mir gesagt hast.

Folgendes habe ich dabei getan. Während der Debugger zugeschlagen hat, bin ich mit der Maus über die für mich eigentlich wichtigen Variablen gegangen und habe dabei folgende Daten zusammen getragen:

TextAlign = taCenter
daraus folgt, dass
myAlignment := 1 zugewiesen wird.

Layout = tlBottom
daraus folgt, dass zu
myAlignment DT_BOTTOM "addiert" wird, was am Ende eine 9 ergibt

In DrawText wird dann auch die 9 zugewiesen. Ich hoffe, dass ich alles richtig beschrieben habe. Also ist Layout auf jeden Fall schon mal belegt und es hat auch den richtigen Inhalt, den ich im OI zugewiesen habe. Wenn ich testweise man Layout auf tlCenter stellt ist myAlignment = 5. Das scheint stimmig zu sein...

Keine Ahnung was da nun falsch ist...!?

Ok, und da ich ja einen Text auf das Control schreibe, möchte ich natürlich auch den Font zuweisen können. Ich habe mir aus einem Tutorial alles zusammengesucht, was ich dafür brauche, aber die Zuweisung scheint nicht zu funzen. Kann man denn dem Canvas einen Font zuweisen?

Folgenden Code benutze ich für den Font bisher:
Delphi-Quellcode:
  private
    ...
    FFont: TFont;
  published
    property Font: TFont read FFont write FFont;

constructor TmyPanel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFont:=TFont.Create;
  ...

destructor TmyPanel.Destroy;
begin
  FFont.Free;
  ...

procedure TmyPanel.Paint;
begin
  ...
  Canvas.Font       := Font;
Habe ich da was wichtiges vergessen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 6 von 13   « Erste     456 78     Letzte »    

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