-
Content Count
2265 -
Joined
-
Last visited
-
Days Won
117
Posts posted by Anders Melander
-
-
Okay, so you are trying to interface to an external COM library. From the name of the interface I'm guessing this is the interface:
https://ascom-standards.org/Help/Developer/html/T_ASCOM_DeviceInterface_ITelescopeV3.htm
As you can read in the documentation...
https://ascom-standards.org/Help/Developer/html/e7734c14-0562-4010-b0c9-ddb5055cd318.htm
...there should be a type library that you can use.
The easiest way to use this type library is to have Delphi create a wrapper for you:
- From the Delphi IDE menu, select Component->Import Component...
- Select Import a Type Library
- Find the type library in the list or select Add and find it on your disk.
-
Edit the Unit Dir Name to place the generated wrapper source code in your project source folder.
I do not recommend that you select "Generate Component Wrappers". - Select Add unit to <name of your project> project.
Delphi will now have created a source file containing all the interfaces, dispinterfaces, enums, coclasses, etc. of the type library.
In order to communicate with the library you will first have to create an instance of a COM object from it. There should be a function in the generated source that will do that for you but since I don't know the library I can't tell what the name of that function is.
If you have some example code, in C, C++ or VB, it should be easy to see from that what you need to do. Post it if you have it and we can take it from there.
-
dispinterface isn't a keyword; Use interface instead:
ITelescopeV3 = interface ['{A007D146-AE3D-4754-98CA-199FEC03CF68}'] . . end;
-
You can't do the fade-in from the constructor because the form isn't visible at that point.
So:
- Create the form.
- Set MasterAlpha=0
- Show the form
- Fade in
I suggest you simply override ShowScreen:
procedure TGameBaseScreen.ShowScreen; begin ScreenImg.Bitmap.MasterAlpha := 0; inherited; // Form is made visible here FadeIn; end;
And there was an endless loop in the Fade in method. This one works:
procedure TGameBaseScreen.FadeIn; var EndTickCount: Cardinal; TickCount: Cardinal; Progress: Integer; Alpha, LastAlpha: integer; const MAX_TIME = 1000; // mS begin ScreenImg.Bitmap.DrawMode := dmBlend; // So MasterAlpha is used to draw the bitmap TickCount := GetTickCount; EndTickCount := TickCount + MAX_TIME; LastAlpha := -1; while (TickCount <= EndTickCount) do begin Progress := Min(TickCount - (EndTickCount - MAX_TIME), MAX_TIME); Alpha := MulDiv(255, Progress, MAX_TIME); if (Alpha <> LastAlpha) then begin ScreenImg.Bitmap.MasterAlpha := Alpha; ScreenImg.Update; LastAlpha := Alpha; end else Sleep(1); TickCount := GetTickCount; end; ScreenImg.Bitmap.MasterAlpha := 255; end;
-
22 minutes ago, PeterPanettone said:What is your advice?
Get a dog.
- 3
-
By bad; Change this:
Progress := Max(TickCount - EndTickCount - MAX_TIME, MAX_TIME);
to this:
Progress := Max(TickCount - (EndTickCount - MAX_TIME), MAX_TIME);
EndTickCount = StartTickCount + MAX_TIME <=>
StartTickCount = EndTickCount - MAX_TIMEso
Elapsed time = TickCount - StartTickCount <=>
Elapsed time = TickCount - (EndTickCount - MAX_TIME)
-
Something like this:
procedure TGameBaseScreen.FadeIn; var EndTickCount: Cardinal; TickCount: Cardinal; Progress: Integer; Alpha, LastAlpha: integer; const MAX_TIME = 1000; // mS begin ScreenImg.Bitmap.DrawMode := dmBlend; // So MasterAlpha is used to draw the bitmap TickCount := GetTickCount; EndTickCount := TickCount + MAX_TIME; LastAlpha := -1; while (TickCount <= EndTickCount) do begin Progress := Max(TickCount - EndTickCount - MAX_TIME, MAX_TIME); Alpha := MulDiv(255, Progress, MAX_TIME); if (Alpha = LastAlpha) then begin Sleep(1); continue; end; ScreenImg.Bitmap.MasterAlpha := Alpha; ScreenImg.Update; LastAlpha := Alpha; TickCount := GetTickCount; end; ScreenImg.Bitmap.MasterAlpha := 255; Application.ProcessMessages; end;
-
2 hours ago, angusj said:It's a problem with the Graphics32 library too if TAffineTransformation is used to do the scaling.
True. Luckily nobody does that 🙂
Here's the bitmap resized with TAffineTransformation.Scale(0.1, 0.1) and TKernelResampler with TCubicKernel:
So pretty much as bad as yours:
But anyway, I think we can conclude that the problem isn't with the cubic filter itself but more with how it's applied.
-
23 minutes ago, angusj said:If you avoid using TAffineTransformation, and just use a resampler together with a renderer, then you do avoid this issue with pixelation.
(In my Image32 graphics library, I use affine transformations without a renderer.)
So: A problem in your implementation - or rather a consequence of the way you have chosen to implement resizing images. Or did I misunderstand what you just wrote?
-
11 hours ago, angusj said:Yet here's a more extreme example of downsampling (scaled to 0.1 of original size) where the quality differences are very noticeable:
It looks to me as if there's a problem in your implementation... Here's what I get with a selection of Graphics32 kernels:
Box
Cubic
Linear
Cosine
Spline
Hermite
Yes, there are differences but IMO they all look good. Even Spline which shouldn't really be used for down-sampling.
Ignore the black line at the top of each image; It's caused by a bug in Firefox's clipboard handling of 32-bit RGBA bitmaps:
-
-
Yes, you are going to use IOTA but you really need to read up on this topic until you understand it.
The basic steps you must take is something like this (pseudo code; don't try to compile it):
// Open the file in the IDE (BorlandIDEServices as IOTAActionServices).OpenFile('my_unit.pas'); // Get the file "module" var Module: IOTAModule := (BorlandIDEServices as IOTAModuleServices).FindModule('my_unit.pas'); // Iterate the module files for var i := 0 to Module.GetModuleFileCount-1 do begin // Get a module file editor var Editor: IOTASourceEditor; if not Supports(Module.GetModuleFileEditor(i), IOTASourceEditor, Editor) then continue; // Make the editor visible Editor.Show // Get an editor view if (Editor.GetEditViewCount = 0) then continue; var EditView: IOTAEditView := Editor.GetEditView(0); // Set the caret position var Position: TOTAEditPos; Position.Col := 1; Position.Line := ... EditView.SetCursorPos(Position); // Scroll to make caret visible and 15 lines down from the top Position.Line := Max(1, Position.Line-15); SetView.SetTopPos(Position); end;
- 3
-
There's one in DWScript: https://github.com/EricGrange/DWScript/blob/c3a26f0e68a5010767681ea1f0cd49726cd4af5d/Source/dwsUtils.pas#L3169
I haven't used it though but knowing Eric, it's probably both fast and well tested. Pity about the 3-space indents though; Very French 🙂
Other than that: https://github.com/search?q=lang%3Apascal+iso8601&type=code
- 1
-
1 hour ago, FreeDelphiPascal said:I need the final image as pf8. But if I set its PixelFormat to pf8, some wavy patterns appear in it
Please google color quantization and dithering.
1 hour ago, FreeDelphiPascal said:like when you convert a high color image to 256 color GIF
Because that's exactly what you are doing.
-
You probably don't have the privileges to query all processes. Try running the application as administrator or elevate privileges from within your application.
https://stackoverflow.com/questions/1435911/c-process-checking
https://stackoverflow.com/questions/34511670/sedebugprivilege-and-openprocess-on-another-account
-
Sure, I could have sugar coated it better.
The point was really that when the expectations turns out not to match reality then one should question the expectations first.
- 1
-
16 minutes ago, PeterBelow said:The reason is quite simple
- Once you think about it.
-
-
I think the MS documentation, while a bit terse, is clear enough; It specifies how the different properties and their limits relate to each other.
The Delphi documentation though is severely lacking. If they had tried to document it properly they would probably have discovered that they got it wrong.
-
29 minutes ago, cecarnicom said:but still a mystery to me why such low limits would exist for an image component
Maybe you should think a bit more about that. Ideally until it is no longer a mystery.
What possible reason could there be for that limit? The 16x16 default is a big clue...
- 2
-
BL.Location := FloatRect(x1, y1, x2, y2);
-
2 hours ago, dummzeuch said:I doubt that jcldebug uses it to get line number information.
It doesn't; It uses the map file.
-
Okay. It would be so much easier if you actually read and answered the questions I have asked you.
The position and size of the layer determines where the bitmap is drawn. Isn't that what you are seeing?
-
I have no idea what you mean
-
And what is the actual result?
Delphi and "Use only memory safe languages"
in General Help
Posted
ISO7185 (anno 1982) would like a word with you about that:
There weren't, to my knowledge, any formal standards before this (the ANSI standard came 1983) but strings has been 1-based since the beginning.