GMLib Waypoint abd show them - delphi-xe2

I try this code, but the waypoints do not show
This code work perfectly, but I can't add a third spot
GMDirection1.DirectionsRequest.Origin.Address := 'My spot 1';
GMDirection1.DirectionsRequest.Destination.Address := 'My spot 2';
GMDirection1.Execute;
But this one, not at all
GMDirection1.DirectionsRequest.WaypointsList.Add.Location.Address := 'My spot 1';
GMDirection1.DirectionsRequest.WaypointsList.Add.Location.Address := 'My spot 2';
GMDirection1.DirectionsRequest.WaypointsList.Add.Location.Address := 'My spot 3';
// or GMDirection1.AddWaypoint.Location.Address := 'My spot';
// I try all Waypoint.Add unsuccessful
GMDirection1.Execute;
My map remains desperately empty
Anyone can help me ?

You need to do
GMDirection1.DirectionsRequest.Origin.Address := 'My spot 1';
GMDirection1.DirectionsRequest.Destination.Address := 'My spot 3';
GMDirection1.DirectionsRequest.WaypointsList.Add.Location.Address := 'My spot 2';
GMDirection1.Execute;
Regards

Related

Allow users choose hotkeys for icon/shortcut in Inno Setup

I'm looking to allow users, who run an installer made trough Inno Setup, to choose whether to use hot keys or not, and if yes, allow them to choose which hot keys use.
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; \
HotKey: "ctrl+alt+b"
Name: "{autoprograms}\{#MyAppName2}"; Filename: "{app}\{#MyAppExeName2}"; \
HotKey: "ctrl+alt+x"
This is my [Icons] section
The Icons section HotKey parameter cannot be modified at run time. So you will have to create the whole shortcut programmatically. An easy API that allows creating a shortcut with a hot key is WScript.Shell.CreateShortcut.
[Code]
var
App1HotKeyCombo: TNewComboBox;
App2HotKeyCombo: TNewComboBox;
const
NoneHotKey = 'None';
procedure InitializeWizard();
var
HotKeysPage: TWizardPage;
ALabel: TNewStaticText;
begin
Log('InitializeWizard');
HotKeysPage := CreateCustomPage(wpSelectTasks, 'Select your hot keys', '');
App1HotKeyCombo := TNewComboBox.Create(HotKeysPage);
App1HotKeyCombo.Parent := HotKeysPage.Surface;
App1HotKeyCombo.Left := ScaleX(200);
App1HotKeyCombo.Top := 0;
App1HotKeyCombo.Width := ScaleX(100);
App1HotKeyCombo.Style := csDropDownList;
App1HotKeyCombo.Items.Add(NoneHotKey);
App1HotKeyCombo.Items.Add('Ctrl+Alt+A');
App1HotKeyCombo.Items.Add('Ctrl+Alt+B');
App1HotKeyCombo.Items.Add('Ctrl+Alt+C');
App1HotKeyCombo.ItemIndex := 1;
ALabel := TNewStaticText.Create(HotKeysPage);
ALabel.Parent := HotKeysPage.Surface;
ALabel.Top := App1HotKeyCombo.Top + ScaleY(4);
ALabel.Left := 0;
ALabel.Caption := 'Hot key for application 1:';
ALabel.FocusControl := App1HotKeyCombo;
App2HotKeyCombo := TNewComboBox.Create(HotKeysPage);
App2HotKeyCombo.Parent := HotKeysPage.Surface;
App2HotKeyCombo.Left := App1HotKeyCombo.Left;
App2HotKeyCombo.Top := App1HotKeyCombo.Top + App1HotKeyCombo.Height + ScaleY(8);
App2HotKeyCombo.Width := App1HotKeyCombo.Width;
App2HotKeyCombo.Style := csDropDownList;
App2HotKeyCombo.Items.Assign(App1HotKeyCombo.Items);
App2HotKeyCombo.ItemIndex := 2;
ALabel := TNewStaticText.Create(HotKeysPage);
ALabel.Parent := HotKeysPage.Surface;
ALabel.Top := App2HotKeyCombo.Top + ScaleY(4);
ALabel.Left := 0;
ALabel.Caption := 'Hot key for application 2:';
ALabel.FocusControl := App2HotKeyCombo;
end;
procedure CreateShortCut(IconName, Path: string; AppHotKeyCombo: TNewComboBox);
var
WshShell: Variant;
ShellLink: Variant;
Msg: string;
begin
WshShell := CreateOleObject('WScript.Shell');
IconName := ExpandConstant(IconName) + '.lnk';
ShellLink := WshShell.CreateShortcut(IconName)
ShellLink.TargetPath := ExpandConstant(Path);
ShellLink.WindowStyle := SW_SHOWNORMAL;
if AppHotKeyCombo.Text <> NoneHotKey then
ShellLink.Hotkey := AppHotKeyCombo.Text;
ShellLink.Save;
Msg := 'Created "%s" icon pointing to "%s" with "%s" hotkey';
Log(Format(Msg, [IconName, ShellLink.TargetPath, ShellLink.Hotkey]));
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
CreateShortCut('{autoprograms}\MyProg1', '{app}\MyProg.exe', App1HotKeyCombo);
CreateShortCut('{autoprograms}\MyProg2', '{app}\MyProg.exe', App2HotKeyCombo);
end;
end;
A more robust API, is IShellLink. That's what Inno Setup uses internally. Though it requires considerably alot more code. For some examples, see Check for existence of a shortcut pointing to a specific target in Inno Setup.
You will also have to ensure that the shortcuts get deleted on uninstall. You can use UninstallDelete section for that.
If you do not want to code the shortcut creation, an alternative approach would be to use preprocessor to generate separate [Icons] entry for each shortcut you want to offer and use Check parameters to activate only the entry corresponding to the shortcut the user selects.

utl_lms.format_message | PL/SQL | URL correct in <a> but dot is missing in href

I'm trying to send a mail with a link inside.
l_url := 'https://example.test.com/';
l_body := utl_lms.format_message('<body>%s</body>', l_url, l_url);
But here's what I have as result :
<body>https://example.test.com/</body>
Why the "." is missing in the href...?
UPDATE
I have countered this problem. It works, but it doesn't solve it.
l_url := 'https://example.test..com/';
l_body := utl_lms.format_message('<body>%s</body>', l_url, replace(l_url, '..', '.'));
Result :
<body>https://example.test.com/</body>

Problem with Delphi 10.3 Community PaintBox Repaint-Function

I am currently making a little Program in Delphi 10.3 Community Version 26.0.34749.6593. No additional components.
Essentially I draw on TPaintBox which is fitted in a Panel. Everything works fine so far, but when the objects are repainted via "PaintBox1.Repaint" the Objects got the wrong BrushStyle (bsSolid when they should have bsClear e.g.) Of course I tried to pin it down, but I got no luck. But I found out that at the following Point something doesn't work:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i: Integer;
fig : ^TFigure;
apen: TPenStyle;
abrush: TBrushStyle;
color1,color2: TColor;
begin
aPen := PaintBox1.Canvas.Pen.Style;
aBrush := bsStyle;
color1 := PaintBox1.Canvas.Brush.Color;
color2 := PaintBox1.Canvas.Pen.Color;
for I:=0 to List.Count-1 do
begin
fig := List.Items[i];
case fig.Typ of
f_Kreis : begin
with Paintbox1.Canvas do
begin
pen.Style := fig.Pen;
Brush.Style := fig.Brush;
pen.Color := fig.PenColor;
brush.Color := fig.BrushColor;
Ellipse(fig.X,fig.Y,fig.X2,fig.Y2);
end;
end;
f_Rechteck : begin
with PaintBox1.Canvas do
begin
Pen.Style := fig.Pen;
Brush.Style := fig.Brush;
Pen.Color := fig.PenColor;
Brush.Color := fig.BrushColor;
Rectangle(fig.X,fig.Y,fig.X2,fig.Y2);
end;
end;
f_Line : begin
with PaintBox1.Canvas do
begin
pen.Style := fig.Pen;
brush.Style := fig.Brush;
pen.Color := fig.PenColor;
brush.Color := fig.BrushColor;
MoveTo(fig.X,Fig.Y);
LineTo(fig.X2,fig.Y2);
end;
end;
end;
end;
PaintBox1.Canvas.Pen.Style := aPen;
bsStyle := aBrush;
PaintBox1.Canvas.Brush.Color := color1;
PaintBox1.Canvas.Pen.Color := color2;
end;
So when the "Brush.Style := fig.Brush;"-Line is called, nothing happens. I went step by step and after these Line "Brush.Style" is still "bsSolid" even when "fig.Brush" is "bsClear"
For explanation: TFigure is my own class. It houses information about a drawing, such as a rectangle. It is the parent class.
Do I miss something. I really am out of Ideas. Can anyone tell me, why nothing happens?
Edit:
For testing I added the lines:
if Brush.Style <> fig.Brush then
ShowMessage('Warnung!');
under
Brush.Style := fig.Brush;
and it actually wont set it on false, though Brush.Style is bsSolid and fig.Brush is bsClear.
You have declared fig : ^TFigure;, but class instances are already references (pointers). Thus you are creating a pointer to reference, and using that pointer as if it were the reference.
Remove the pointer operator and declare
fig: TFigure;
I can't verify whether there are other errors in your code

PASCAL: converting user input string to first letter uppercase, the rest lowercase. How can I do this?

As it says in the title.
I'm writing a program which asks the user to input a surname surname then a first name and finally an address.
When this is done it prints out a table of the results and then organises then alphabetically based first on surname, then first name and finally address.
All this is done. I just have to make it that the table always prints out with first letters uppercase and the rest lowercase, ie:
input: jOHN SMith
output: John Smith
How can I do this in Pascal?
Here is the code I've written for this part so far:
writeln();
write(UpCaseFirstChar(arrSurnames[count]):15);
write(UpCaseFirstChar(arrFirstNames[count]):15);
write(UpCaseFirstChar(arrAddress[count]):30);
writeln();
I have a function for uppercasing the first letter, how can I change it to lowercase the rest?
EDIT: Here is the uppercase function:
function UpCaseFirstChar(const S: string): string;
begin
Result := S;
if Length(Result) > 0 then
Result[1] := UpCase(Result[1]);
end;
EDIT 2: I think I figured it out. Here is the new code for the UpCase/LowerCase function in case anyone is interested:
function UpCaseFirstChar(const S: string): string;
var
i: integer;
begin
Result := S;
if Length(Result) > 0 then
Result[1] := UpCase(Result[1]);
for i := 2 to Length(Result) do
begin
Result[i] := LowerCase(Result[i]);
end;
end;
Your update is more verbose than it needs to be. If you read the documentation carefully, the function LowerCase applies to a string. So you could write:
function UpCaseFirstChar(const S: string): string;
begin
if Length(S) = 0 then
Result := S
else begin
Result := LowerCase(S);
Result[1] := UpCase(Result[1]);
end;
end;

WINAPI explorer shell document "details"

In a similar vein to this question, I'm after a way to pragmatically read the information in the "details" pane that is shown when you select "properties" in explorer.
For example in the screenshots below,
a few random details are circled.
i am not after a way to determine the specific items circled in some other way (eg please don't suggest how to find out the width in pixels of an image) that is not what i am after. i need a way to parse all the information that is available, for display purposes in my own program, without having to "know" about the files myself. this is simply to create a specific user interface without having to actually open up the Dialogs shown.
For what its worth, the language du jour is Delphi, but i am quite capable of translating c++ or any other dialect of winapi code, but if you happen to have delphi code, that would be a bonus for me personally.
edit: i'd like to be able to get document specific details, eg the slide count in a powerPoint document, which does not conform to the standardarized constants you need to access properties that most documents have.
i can for example get some basic information from a powerpoint document using this code (but not the slide count).
uses shellapi,ComObj;
{$R *.dfm}
const
FmtID_SummaryInformation: TGUID =
'{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
function FileTimeToDateTimeStr(F: TFileTime): string;
var
LocalFileTime: TFileTime;
SystemTime: TSystemTime;
DateTime: TDateTime;
begin
if Comp(F) = 0 then Result := '-'
else
begin
FileTimeToLocalFileTime(F, LocalFileTime);
FileTimeToSystemTime(LocalFileTime, SystemTime);
with SystemTime do
DateTime := EncodeDate(wYear, wMonth, wDay) +
EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
Result := DateTimeToStr(DateTime);
end;
end;
function GetDocInfo(const FileName: WideString): string;
var
I: Integer;
PropSetStg: IPropertySetStorage;
PropSpec: array[2..19] of TPropSpec;
PropStg: IPropertyStorage;
PropVariant: array[2..19] of TPropVariant;
Rslt: HResult;
S: string;
Stg: IStorage;
begin
Result := '';
try
OleCheck(StgOpenStorage(PWideChar(FileName), nil, STGM_READ or
STGM_SHARE_DENY_WRITE,
nil, 0, Stg));
PropSetStg := Stg as IPropertySetStorage;
OleCheck(PropSetStg.Open(FmtID_SummaryInformation,
STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg));
for I := 2 to 19 do
begin
PropSpec[I].ulKind := PRSPEC_PROPID;
PropSpec[I].PropID := I;
end;
Rslt := PropStg.ReadMultiple(18, #PropSpec, #PropVariant);
OleCheck(Rslt);
if Rslt <> S_FALSE then for I := 2 to 19 do
begin
S := '';
if PropVariant[I].vt = VT_LPSTR then
if Assigned(PropVariant[I].pszVal) then
S := PropVariant[I].pszVal;
case I of
2: S := Format('Title: %s', [S]);
3: S := Format('Subject: %s', [S]);
4: S := Format('Author: %s', [S]);
5: S := Format('Keywords: %s', [S]);
6: S := Format('Comments: %s', [S]);
7: S := Format('Template: %s', [S]);
8: S := Format('Last saved by: %s', [S]);
9: S := Format('Revision number: %s', [S]);
10: S := Format('Total editing time: %g sec',
[Comp(PropVariant[I].filetime) / 1.0E9]);
11: S := Format('Last printed: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
12: S := Format('Create time/date: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
13: S := Format('Last saved time/date: %s',
[FileTimeToDateTimeStr(PropVariant[I].filetime)]);
14: S := Format('Number of pages: %d', [PropVariant[I].lVal]);
15: S := Format('Number of words: %d', [PropVariant[I].lVal]);
16: S := Format('Number of characters: %d',
[PropVariant[I].lVal]);
17:; // thumbnail
18: S := Format('Name of creating application: %s', [S]);
19: S := Format('Security: %.8x', [PropVariant[I].lVal]);
else
S := Format('unknown property#%d: %s', [i,S]);
end;
if S <> '' then Result := Result + S + #13#10;
end;
finally
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.text :=GetDocInfo('C:\mypowerpoint.ppt');
end;
There are samples in C++ in the Windows 7 SDK that demonstrate property enumeration (under Samples\winui\shell\appplatform\PropertyEdit), as well as a longer demo on CodePlex.
There isn't a "canonical" list of properties, as the property system is extensible; however, the Microsoft list of properties is part of the SDK and is found in propkey.h.

Resources