How can I use pen pressure property in delphi? - delphi

I'm use this code for get pressure property but does not work. Why GetPointerPenInfo function return false?
LastError function return 87 (incorrect parameter)
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.wmPointer, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
procedure PenEvent(var msg: TWMPointerUpdate); message WM_POINTERUPDATE;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
{ TForm1 }
procedure TForm1.PenEvent(var msg: TWMPointerUpdate);
var
pInfo: PPointerPenInfo;
begin
if GetPointerPenInfo(msg.pointerId, pInfo) then
Label1.Caption := inttostr(pInfo.pressure);
end;
end.

You are passing an uninitialized pointer to GetPointerPenInfo(). Try this instead:
procedure TForm1.PenEvent(var msg: TWMPointerUpdate);
var
Info: TPointerPenInfo;
begin
if not GetPointerPenInfo(msg.pointerId, #Info) then RaiseLastOSError;
Label1.Caption := IntToStr(Info.pressure);
end;

Related

Getting country using GetLocaleInfo Example

I am trying to get Country in Delphi using GetLocalInfo in Delphi.
I have this code
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
pcLCA:Array[0..20] of Char;
country : String;
Flag: Integer;
begin
country := GetLocaleInfo(LOCALE_USER_DEFAULT, Flag, pcLCA,19);
showmessage(country);
end;
end.
But here is the main issue, When i run it, i am getting this as error
[dcc32 Error] Unit1.pas(33): E2010 Incompatible types: 'string' and 'Integer'
on the GetLocaleInfo Line Please what am I not doing correctly. New to this.
GetGeoInfo return value is int which is incompatible with string.

Delphi TImage Loading GIF Bad Qality

While a process is running in the background, I show a loading animation on the screen. But the GIF looks very bad quality. How can I fix this problem?
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Imaging.GIFImg, Vcl.ExtCtrls,
Vcl.StdCtrls;
type
TForm3 = class(TForm)
Image1: TImage;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
var
sFile: string;
end;
var
Form3: TForm3;
aGIF: TGIFImage;
bmp:TBitmap;
implementation
{$R *.dfm}
procedure TForm3.FormShow(Sender: TObject);
begin
aGIF := TGIFImage.Create;
aGIF.LoadFromFile(sFile);
aGIF.Animate := True;
Image1.Picture.Assign(aGIF);
aGIF.Free;
end;
end.

Creating a VCL form in dll Delphi

I have this code that is merely trying to create a form in a DLL. I created the DLL and the form through the RAD studio Berlin IDE. I wanted to just put up a blank form to make sure it was working, unfortunately it is crashing with an EAcess violation (or alternately, an EResNotFound exception with message "Resource TSigForm can not be found"), and I can't figure out what is missing.
DLL code:
library SigDLL;
uses
System.SysUtils, System.Classes, Windows, Vcl.Forms, Vcl.Dialogs,
SignatureForm in 'SignatureForm.pas' {SigForm1};
{$R *.res}
var
SigForm: TSigForm;
procedure PrepareSigDLL(AppHandle : HWND); stdcall;
begin
SigForm := TSigForm.Create(nil); // <--------- CRASHES HERE
end;
procedure GetSignature(Variables: PChar); stdcall;
begin
ShowMessage('GetSignature called!');
end;
procedure CloseSigDLL; stdcall;
begin
ShowMessage('CloseSigDLL called!');
end;
exports
PrepareSigDLL,
GetSignature,
CloseSigDLL;
begin
end.
SigForm code:
unit SignatureForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TSigForm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
SigForm: TSigForm;
implementation
{$R *.dfm}
end.
Generic Host app for DLL:
unit SigDllHost;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
procedure PrepareSigDLL(handle: HWND); stdcall; external 'SigDll.dll';
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
PrepareSigDLL(Self.Handle);
end;
end.

Delphi generic frame

I'm still here with a questione about Delphi frames.
I would like to create an application that use various type of frames in order to manage different database tables, so trying to understand how to do this kind of task I've create a simple Delphi Form:
unit main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.ExtCtrls, FramesManagement;
type
TfrmMain = class(TForm)
pnlCommands: TPanel;
pnlFrames: TPanel;
btnFrame1: TButton;
btnFrame2: TButton;
procedure FormCreate(Sender: TObject);
procedure btnFrame1Click(Sender: TObject);
procedure btnFrame2Click(Sender: TObject);
private
FFrame: IFrameManagement;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
uses Frame1, Frame2;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FFrame := TFramemanagement.Create;
end;
procedure TfrmMain.btnFrame1Click(Sender: TObject);
begin
FFrame.CreateGenericFrame(pnlFrames, TFrame(Frame1.TFra1));
end;
procedure TfrmMain.btnFrame2Click(Sender: TObject);
begin
FFrame.CreateGenericFrame(pnlFrames, TFrame(Frame2.TFra2));
end;
end.
This form make use of an interface declared as following:
unit FramesManagement;
interface
uses
Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls, Frame1, Frame2;
type
IFrameManagement = interface
['{A00E0D1B-3438-4DC4-9794-702E8302B567}']
procedure CreateGenericFrame(ParentPanel: TPanel; FrameName: TFrame);
end;
TFrameManagement = class(TInterfacedObject, IFrameManagement)
private
genericFrame: TFrame;
procedure CreateGenericFrame(ParentPanel: TPanel; FrameName: TFrame);
end;
implementation
procedure TFrameManagement.CreateGenericFrame(ParentPanel: TPanel;
FrameName: TFrame);
begin
genericFrame := FrameName.Create(ParentPanel);
genericFrame.Parent := ParentPanel;
end;
And here there are the two frames.
Frame 1:
unit Frame1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TFra1 = class(TFrame)
txtFrame1: TStaticText;
txtFrameType: TStaticText;
lblFrameType: TLabel;
private
public
end;
implementation
{$R *.dfm}
end.
and Frame 2:
unit Frame2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TFra2 = class(TFrame)
txtFrame2: TStaticText;
txtFrameType: TStaticText;
lblFrameType: TLabel;
private
public
end;
implementation
{$R *.dfm}
end.
This is all the code, but When I run the application and I try to create the first or the second frame i receive an error like this:
I've thought the solution may be the use of generics but I don't know how to use them. Is my thought right or there is another way to reache this gol?
Can Anyone help me?
procedure TFrameManagement.CreateGenericFrame(ParentPanel: TPanel; FrameName: TFrame);
begin
genericFrame := FrameName.Create(ParentPanel);
genericFrame.Parent := ParentPanel;
end;
Here FrameName is an instance and you are calling the constructor of that instance. You are not creating a new instance as you intend to do.
You need to use meta classes.
type
TFrameClass = class of TFrame;
procedure TFrameManagement.CreateGenericFrame(ParentPanel: TPanel; FrameClass: TFrameClass);
begin
genericFrame := FrameClass.Create(ParentPanel);
genericFrame.Parent := ParentPanel;
end;
You can call this like so:
FFrame.CreateGenericFrame(pnlFrames, Frame2.TFra2);

Access violation with TDictionary.Add

Anyone know why I am getting an access violation with the following:
unit TestForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Generics.Collections, Vcl.Grids,
Vcl.ValEdit;
type
TClientThing = class
private
iCDic: TDictionary<string, string>;
published
property Dic: TDictionary<string, string> read iCDic write iCDic;
end;
TForm1 = class(TForm)
vleHeader: TValueListEditor;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
ClientThing: TClientThing;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
vCustomParamKey: string;
vCustomValueKey: string;
J: integer;
begin
with ClientThing do
begin
// Get the header params from the config and list edit...
for J := 0 to vleHeader.RowCount - 1 do
begin
vCustomParamKey := vleHeader.Cells[0, J];
vCustomValueKey := vleHeader.Cells[1, J];
Dic.Add(vCustomParamKey, vCustomValueKey);
end;
end;
end;
end.
The Access violation is at the Dic.Add line. The exception is:
I have been up all night and so have probably missed something. The TValueListEditor contents are (code editor view):
X-Application=g9V0rB9a3J5UF8
X-Authentication=kQNvuuimr0yMtEYZtXAZntTScPlvjecEAGtvbnNIU=
JSONRpc=2.0
The form never assigns a value to ClientThing, so it's still nil. Assign it a value, and then assign a value to iCDic. You should have been able to detect this problem when you stepped through the code with the debugger.

Resources