AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen FreePascal Verschiedene Controls an Procedur übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Verschiedene Controls an Procedur übergeben

Ein Thema von Guido Eisenbeis · begonnen am 27. Okt 2011 · letzter Beitrag vom 28. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#1

Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 06:16
Ich benutze Lazarus im {$mode delphi} für Win 32.

Es geht um eine Routine, der ein Control übergeben wird und dann einige Eigenschaften benutzt und geändert werden. Die wichtigsten Eigenschaften sind "Canvas", "(Show)Hint" und "Caption".

Der Routine sollen bei verschiedenen Aufrufen auch verschiedene Controls übergeben werden. Beispiel:

Delphi-Quellcode:
  // Prozedur-Kopf
  procedure TForm1.SetShortenedText(ACtrlWithCanvas: T-???; AText: string);


  // Aufruf-Beispiel
  SetShortenedText(Label1, 'Mein Text');
  SetShortenedText(Panel1, 'Mein Text');
Allerdings kriege ich den Typ für "ACtrlWithCanvas" nicht hin. Benutze ich TControl meckert der Compiler über "dies", nehme ich TGraphicsControl meckert er über "das". Wie kann man das lösen, so dass ich ein beliebiges Control (mit Canvas) übergeben kann, ohne die Routine mit zusätzlichen Übergabe-Parametern aufzublähen?

Guido.

Edit: Das Problem konnte nicht auf direktem Weg gelöst werden. Ein Workaround wird in diesem Thread behandelt.

Geändert von Guido Eisenbeis (28. Okt 2011 um 01:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 07:05
TControl und dann per RTTI schauen ob es die Properties gibt um auf diese Zuzugreifen.
Die nötigen Funktion finden sich hierbei in der Unit Types.
Ob du auf Canvas damit kommst könnte evtl. nicht möglich sein da die RTTI nur für published-Properties den Zugriff ermöglicht.
Aber falls Lazarus auch die erweiterte RTTI schon kann könntest du schauen ob du darüber den Zugriff hin bekommst.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#3

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 07:53
Mn kann auch schauen wo diese Eigenschafften eingeführt wurden und nimmt dieses als Basistyp für den Parameter.

Da Caption aber z.B. schon recht früh vorhanden war, allerdings protected und man demnach eigentlich nicht ran kommt,
kann man diesen Typen dennoch nehmen und macht sich das Property sichtbar, über eine eigene Zugriffsklasse oder man castet einfach in "irgendwas", wo es endlich sichtbar ist.


Die neue RTTI würde ja auf nahezu alles zugreifen können, aber die vom 2006/TDE ist noch etwas "älter".
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.213 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 08:34
... aber die vom 2006/TDE ist noch etwas "älter".
Er nimmt für dieses Anwendungsfall Lazarus:
Zitat:
Ich benutze Lazarus im {$mode delphi} für Win 32.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 08:49
Im Falle der Caption: if AControl is TWinControl then TWinControl(AControl).Perform(WM_SETTEXT, ...
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 08:53
Ein Label hat auch eine Caption und ist garantiert kein TWinControl.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 09:01
Dann musst Du's eben im else-Zweig etwas langwieriger über RTTI behandeln.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 09:18
Ein Label hat auch eine Caption und ist garantiert kein TWinControl.
Richtig. (Hab ich gerade hierbei erfahren müssen.)

TControl und dann per RTTI schauen ob es die Properties gibt um auf diese Zuzugreifen.
So, jetzt isses passiert: Ich gehör zum alten Eisen und bin eingerostet! Die RTTI kenne ich nicht (hab's aber gerade auf Wikipedia nachgescehen) und stehe auf dem Schlauch. Kannst du das mal anders erklären? Meinst du, ich soll nachsehen, ob das übergebene TControl die Eigenschaften Canvas, Hint, Caption, ... hat? Und dann?

Und vielleicht noch eine kleine Erklärung zu der RTTI in Umgangssprache (also für Doofe wie mich )? Wie benutzt man die? "If AControl is ..." oder so?

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 09:50
Du hast zwar zwischenzeitlich bereits geantwortet, aber vielleicht hilft dir das trotzdem weiter:

Da Caption aber z.B. schon recht früh vorhanden war, allerdings protected und man demnach eigentlich nicht ran kommt,
kann man diesen Typen dennoch nehmen und macht sich das Property sichtbar, über eine eigene Zugriffsklasse oder man castet einfach in "irgendwas", wo es endlich sichtbar ist.
In der LCL ist Caption bereits in TControl public . Also kann dieses schonmal mit Hilfe von TControl verarbeitet werden.

ShowHint und Hint sind ebenfalls bereits in TControl zugreifbar, also bleibt nur noch Canvas .

@Guido: Ich empfehle dir also das folgende: Nimm als Parametertyp TControl , dann solltest du schonmal auf Caption , Hint und ShowHint zugreifen können.
Für das Canvas empfehle ich dir das folgende:

Delphi-Quellcode:
var
  thecanvas: TCanvas;
begin
  // Sachen mit Caption und (Show)Hint machen
  ...
  // jetzt den Canvas ermitteln, falls möglich
  if ACtrlWithCanvas is TCustomControl then
    thecanvas := TCustomControl(ACtrlWithCanvas).Canvas
  else
  if ACtrlWithCanvas is TGraphicControl then
    thecanvas := TGraphicControl(ACtrlWithCanvas).Canvas
  else
    (* wir wissen nicht, ob das Control einen Canvas hat
    * (das könnte man jetzt mit RTTI austesten, aber ich
    * brech hier einfac mal ab)
     *)

    Exit;
  // verwende "thecanvas" um auf den Canvas zuzugreifen
end;
is dient übrigens dazu, um herauszufinden ob eine Objektinstanz von einer bestimmten Klasse abgeleitet ist. Zum Beispiel ist someobj is TObject für jede Objektinstanz wahr.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons

Geändert von JamesTKirk (27. Okt 2011 um 14:30 Uhr) Grund: "h" vergessen, wie weiter unten angemerkt...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#10

AW: Verschiedene Controls an Procedur übergeben

  Alt 27. Okt 2011, 10:02
Ich hatte blöderweise nicht auf den Thread, sondern auf einen einzelnen Beitrag verlinkt. Das Gegenstück findet man am Ende des Threads. Das erspart dann die ganzen "is"-Abfragen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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 by Thomas Breitkreuz