TShiftState übergeben in Procedure

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

TShiftState übergeben in Procedure

Beitrag von Int3g3r »

Hallo

Wie kann ich TShiftState in einer Procedure als Parameter übergeben?
Wenn möglich möchte ich Null/Nil übergeben.
unit_main.pas(138,41) Error: Incompatible type for arg no. 3: Got "TShiftStateEnum", expected "TShiftState"
Programm

Code: Alles auswählen

procedure TfrmMain.btnInsertClick(Sender: TObject);
begin
    dbLuSearch(Nil, VK_RETURN, ssShift);
end;

procedure TfrmMain.dbLuSearch(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then
  begin
    UpdateEdits;
  end;
end;            
classesh.inc

Code: Alles auswählen

{ Types used by standard events }
  TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
    ssLeft, ssRight, ssMiddle, ssDouble,
    // Extra additions
    ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
    ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2);

{$packset 1}
  TShiftState = set of TShiftStateEnum;
{$packset default}
Leider werde ich daraus nicht schlau, dazu existiert ein ssNone nicht.

Gruss Int3g3r

TBug
Beiträge: 172
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TShiftState übergeben in Procedure

Beitrag von TBug »

Hallo Int3g3r,
Int3g3r hat geschrieben:
Mo 1. Aug 2022, 17:13
Leider werde ich daraus nicht schlau, dazu existiert ein ssNone nicht.
Dafür sollte allerdings Basiswissen ausreichen.

Da Du selbst die Deklaration "TShiftState = set of TShiftStateEnum;" aus der classesh.inc aufgeführt hast, sollte Dir nicht entgangen sein, dass TShiftState ein Set ist und kein einzelner Wert. Siehe auch Deine gepostete Fehlermeldung!

Und da es sich um ein Set handelt, benötigst Du auch kein ssNone, sondern lässt das Set einfach leer [].

.

Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

Re: TShiftState übergeben in Procedure

Beitrag von Int3g3r »

TBug hat geschrieben:
Mo 1. Aug 2022, 18:31

Und da es sich um ein Set handelt, benötigst Du auch kein ssNone, sondern lässt das Set einfach leer [].
Danke, nun weis sich das "[]" korrekt ist, dies hatte ich bereits versucht.
Nun erhalte ich aber folgende Fehlermeldung:
unit_main.pas(138,32) Error: Variable identifier expected

Code: Alles auswählen

procedure TfrmMain.btnInsertClick(Sender: TObject);
begin
    dbLuSearch(Nil, VK_RETURN, []);
end;

procedure TfrmMain.dbLuSearch(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then
  begin
    UpdateEdits;
  end;
end;        

Benutzeravatar
six1
Beiträge: 720
Registriert: Do 1. Jul 2010, 19:01

Re: TShiftState übergeben in Procedure

Beitrag von six1 »

übergebe mal self oder Sender und nicht NIL
Gruß, Michael

Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

Re: TShiftState übergeben in Procedure

Beitrag von Int3g3r »

six1 hat geschrieben:
Mo 1. Aug 2022, 19:40
übergebe mal self oder Sender und nicht NIL
Funktioniert nicht. Immer noch die gleiche Meldung.

unit_main.pas(138,35) Error: Variable identifier expected

TBug
Beiträge: 172
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TShiftState übergeben in Procedure

Beitrag von TBug »

Hallo zusammen,
Int3g3r hat geschrieben:
Mo 1. Aug 2022, 20:26
six1 hat geschrieben:
Mo 1. Aug 2022, 19:40
übergebe mal self oder Sender und nicht NIL
Funktioniert nicht. Immer noch die gleiche Meldung.

unit_main.pas(138,35) Error: Variable identifier expected
Das ist ja schon fast stochern im Nebel.

Schau dir einmal Deine Deklaration der Procedure an:

Code: Alles auswählen

procedure TfrmMain.dbLuSearch(Sender: TObject; var Key: Word; Shift: TShiftState);
Wie kommst Du bei dieser Deklaration darauf, dass Du als "Key" die Konstante VK_RETURN direkt übergeben könntest?

Auch hier gibt Dir die von Dir selbst gepostete Fehlermeldung schon den entscheidenden Hinweis!
.

wennerer
Beiträge: 411
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_
CPU-Target: x86_64-linux-gtk2

Re: TShiftState übergeben in Procedure

Beitrag von wennerer »

Hallo Int3g3r,

probiere mal das:

Code: Alles auswählen

TfrmMain.btnInsertClick(Sender: TObject);
var  aKey: Word;
begin
  aKey := VK_Return;
  dbLuSearch(Nil,aKey,[]);
end;  
Viele Grüße
Bernd

TBug
Beiträge: 172
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TShiftState übergeben in Procedure

Beitrag von TBug »

Hallo wennerer,

jetzt ist der Lerneffekt weg.

Aus dem was ich im Post vor Deinem geschrieben habe, hätte Int3g3r das selbst ableiten können, wenn er Willens ist, seine Basics zu verfestigen, oder überhaupt erst zu lernen.
.

Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

Re: TShiftState übergeben in Procedure

Beitrag von Int3g3r »

TBug hat geschrieben:
Mo 1. Aug 2022, 20:50
Wie kommst Du bei dieser Deklaration darauf, dass Du als "Key" die Konstante VK_RETURN direkt übergeben könntest?

Auch hier gibt Dir die von Dir selbst gepostete Fehlermeldung schon den entscheidenden Hinweis!
.
Danke. Nun bin ich einen Schritt weiter.
Error: Variable identifier expected

This happens when you pass a constant to a routine (such as Inc var or Dec) when it expects a variable. You can only pass variables as arguments to these functions.

Code: Alles auswählen

procedure TfrmMain.btnInsertClick(Sender: TObject);
var return: Word;
begin
    return := 13;
    dbLuSearch(Nil, return, []);
end;

procedure TfrmMain.dbLuSearch(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then
  begin
    UpdateEdits;
  end;
end;   
Gibt es dafür noch eine andere, schönere Lösung?
Diese Variable ist meines erachtens komplett überflüssig.
Ich erstelle diese nur damit ich sie übergeben kann.

Gruss Int3g3r

TBug
Beiträge: 172
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TShiftState übergeben in Procedure

Beitrag von TBug »

Hallo Int3g3r,
Int3g3r hat geschrieben:
Mo 1. Aug 2022, 21:38
Gibt es dafür noch eine andere, schönere Lösung?
Diese Variable ist meines erachtens komplett überflüssig.
Ich erstelle diese nur damit ich sie übergeben kann.
Gegenfrage:
Hast Du die Prozedur "dbLuSearch" selbst definiert, oder ist es ein Event einer Komponente (Sieht jedenfalls danach aus)?
.

Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

Re: TShiftState übergeben in Procedure

Beitrag von Int3g3r »

TBug hat geschrieben:
Mo 1. Aug 2022, 21:44
Gegenfrage:
Hast Du die Prozedur "dbLuSearch" selbst definiert, oder ist es ein Event einer Komponente (Sieht jedenfalls danach aus)?
.
Es ist ein Event einer DBLookupComboBox.

PascalDragon
Beiträge: 670
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: TShiftState übergeben in Procedure

Beitrag von PascalDragon »

Int3g3r hat geschrieben:
Mo 1. Aug 2022, 23:42
TBug hat geschrieben:
Mo 1. Aug 2022, 21:44
Gegenfrage:
Hast Du die Prozedur "dbLuSearch" selbst definiert, oder ist es ein Event einer Komponente (Sieht jedenfalls danach aus)?
.
Es ist ein Event einer DBLookupComboBox.
Dann kannst du da nichts dran ändern, da die Behandlung des Ereignisses eben in der Lage sein darf den Key zu ändern und das geht nur mit var.

Du könntest aber den Code aus dbLuSearch in eine separate Methode verfrachten mit besserer Signatur und die von beiden anderen Methoden aufrufen.
FPC Compiler Entwickler

Int3g3r
Beiträge: 10
Registriert: Mo 1. Aug 2022, 17:01

Re: TShiftState übergeben in Procedure

Beitrag von Int3g3r »

Vielen Dank an alle für die Hilfe.

Gruss Int3g3r

TBug
Beiträge: 172
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TShiftState übergeben in Procedure

Beitrag von TBug »

Hallo zusammen,
PascalDragon hat geschrieben:
Di 2. Aug 2022, 07:47
Du könntest aber den Code aus dbLuSearch in eine separate Methode verfrachten mit besserer Signatur und die von beiden anderen Methoden aufrufen.
Oder aber gleich in der Prozedur btnInsertClick direkt UpdateEdits aufrufen.

Code: Alles auswählen

procedure TfrmMain.btnInsertClick(Sender: TObject);
begin
    UpdateEdits;
end;
Dann enfällt jeder Overhead.

.

Antworten