-
Content Count
2589 -
Joined
-
Last visited
-
Days Won
135
Everything posted by Anders Melander
-
Vcl text box that user can move/resize at runtime?
Anders Melander replied to Paul Dardeau's topic in VCL
It's not "relatively common". In my 30 years with Delphi I think I've only had a need to do it (resize a control with the mouse) once and that was for a run-time form designer. Moving a control can be done with something like 10 lines of code. Resize is harder. The Raize controls are owned by Embarcadero now and can probably be installed via GetIt. https://blogs.embarcadero.com/konopka-signature-vcl-controls-version-7/ That's not how I would do it but it's certainly a possibility. Why not try it instead of just giving up? Okay then: I googled the problem, read a lot of examples, tried some different solutions and then wrote some code based on the experience I just acquired. Worked great! Better? Fair enough. Sorry about that. I guess I just don't understand that approach to problem solving. -
Vcl text box that user can move/resize at runtime?
Anders Melander replied to Paul Dardeau's topic in VCL
As far as I can see both of the searches above returns a plethora of relevant answers to your question, which you are not exactly the first to ask. So what's preventing you from using any of them? -
Vcl text box that user can move/resize at runtime?
Anders Melander replied to Paul Dardeau's topic in VCL
Let me teach you a trick: https://www.google.com/search?q=delphi+move+control+runtime https://www.google.com/search?q=delphi+resize+control+runtime -
So you're not using version control?
-
Use process explorer instead and look at the threads. It will show you the call stack which might get you some hint about what it's doing. 9 out of 10 times when the IDE hangs for me it's caused by the Structure View when the form editor is active (see above) - and the IDE never recovers. Specifically it appears to be a problem with the VirtualTreeView used by the Structure View.
-
I don't know where you are reading this but the sentence is assuming that the pointer points to an element in an array of integers. So incrementing the pointer will make it point to the next integer in the array. Maybe you should stay away from pointers until you figure this out 🙂
-
Not everything is an issue or an enhancement request. It's common to have discussions enabled so a topic can be debated before it becomes a task - if ever. It's a question of how you manage a project but if Remy prefers everything in one place then it should stay that way since the issue list is primarily a tool for the maintainers, not for the users. Personally I prefer questions and other chit-chat in the discussions. I manage a lot of different projects and I need the issue lists to only show me work items.
-
Old ProfGrid component: modernize or migrate away?
Anders Melander replied to BeeGee's topic in General Help
I would go with option 1; Get rid of the technical debt once and for all. Even if you managed to get ProfGrid working now (which is probably possible, given enough effort) you would then have to maintain it yourself going forward and since you don't have Pascal expertise this doesn't sound sustainable. -
There's no design-time code in it so unless the unit is used by other design-time packages there's really no reason to do that.
-
ANN: Better Translation Manager released
Anders Melander replied to Anders Melander's topic in Delphi Third-Party
It seems the ZZZ locales are "supplemental" or "custom" locales and that the information Windows returns about them (such as their abbreviated name (ZZZ)) depends on whether they are used by the current user or not. Wonderful! I've now added a checkbox to the Languages dialog to hide these misfits by default. There are still a few remaining ZZZ locales though that I can't explain. Hmmm. It seems LOCALE_SABBREVLANGNAME has been deprecated. It would have been nice if they had updated the documentation to reflect that little detail. https://github.com/tpn/winsdk-10/blob/master/Include/10.0.16299.0/um/WinNls.h#L750 -
Better Translation Manager https://bitbucket.org/anders_melander/better-translation-manager The Better Translation Manager (BTM) is a replacement for the Delphi Translation Manager a.k.a. the Integrated Translation Environment (ITE) and External Translation Manager (ETM). Why is it better? Well, for one thing, it's free but more important; It actually works - unlike the ITE/ETM. Why? The standard Translation Manager that ships with Delphi today was originally an individual product known as the Borland Translation Suite. With Delphi 5 it became a part of the enterprise edition. The Borland Translation Suite showed great promise but unfortunately it never evolved from its roots as an external tool and has always been hampered by severe bugs that made it completely unusable in practice. As a result nobody uses it. This can be witnessed by the plethora of homegrown and commercial alternatives. The great benefit of the standard translation system is that it just works (this is the system itself I'm talking about, not the tools. The tools suck). Apart from the requirement that you must use resourcestrings you don't need to do anything special when writing your code. At run time you just place the compiled resource modules in the same folder as your application and the Delphi Run Time Library automatically takes care of loading and using the translations based on the current Windows user interface language. Anyway, since Embarcadero has now finally admitted that they are never going to fix the Delphi Translation Manager and instead recommend that we find alternative solutions, I decided that it was time I solved this little problem once and for all. The core functionality of the Better Translation Manager was written in two weeks during my summer vacation in Italy 2019. Amazing what you can do with a little pasta! Features Does not require any changes to the source code of the application being translated. Works with the existing standard Delphi localization system. Translates resourcestrings and all strings in forms regardless of any 3rd party components used. Works on compiled application. Source code is never used. Generates localized binary resource modules (resource DLLs). Does not use an external compiler. Can import existing translations from compiled application and resource modules or from XLIFF localization source files (dfn, rcn files). Read and save TMX and TBX translation memory files. Import Translation Memory from TMX (Translation Memory eXchange), TBX (TermBase eXchange), Microsoft Glossary and CSV. Machine Translation using Translation Memory, Microsoft Translation Service or Microsoft Terminology Service. Forms, Components, Types and Values that should be ignored can be specified in a Stop List. Translations are Spell Checked. Validation Rules to catch common translation mistakes. Supports Right To Left (RTL) editing based on translation language. Translation project is stored in a single XML file. Command line interface for use in automated build systems. Fast! Refreshing a large project typically takes less than a second vs. many minutes with the ITE/ETM. Supports all Unicode versions of Delphi (i.e. Delphi 9 and later). Resource modules contain the version resource of the source application. What it doesn't do There's one task that BTM, by design, doesn't attempt to solve: Localizing the placement and size of controls. Since it has been my experience that it is a far better idea to design the user interface in such a way that the layout automatically accommodates changes in font- and text size and shorter/longer texts due to translation, I decided from the start that I would not be supporting localization of size and position of controls. This also relieved me of having to create a run time form designer, supporting 3rd party controls visually (something that nobody so far has managed to find a foolproof solution to) and deciding what individual properties constitutes size/position values. Instead I just localize all string values - and only string values. But wait... There's More! Yup, you not only get this little wonder for free. You get the full source code too. Grab it at the repository linked at top. More details at the repository. Enjoy / Anders Melander
-
ANN: Better Translation Manager released
Anders Melander replied to Anders Melander's topic in Delphi Third-Party
Ah! I see what the problem is; Microsoft has changed their locale database again. They've added a bunch of weird language variants that return ZZZ as their "abbreviated language name" - among them a lot of English variants. For example, what the hell is "English (Finland)" or "English (World)" ? What exact target language did you specify? I think that if you change the target language to just "English" with no variant then the filetype should become ENU (which is actually English (United States)). You can also go into the settings and change the File naming scheme to RFC 4646. -
ANN: Better Translation Manager released
Anders Melander replied to Anders Melander's topic in Delphi Third-Party
If the filename of the generated language module is *.ZZZ then something is wrong. It should be *.EN* The precise filetype depends on what English variant you chose. Does it work if you change the filetype to just .EN ? -
properties Is it possible to copy all properties from one TMemo to a dynamically created TMemo?
Anders Melander replied to JohnLM's topic in VCL
So don't set them at design-time; Set them at run-time in a function that will then also be used setup the other memos. There aren't that many properties on a TMemo so I really don't think it's worth it to try and be clever here but if you really want to you can either use RTTI or streaming (see TStream.WriteComponent/ReadComponent). If your memo use event handlers you will get into trouble with the stream method.- 14 replies
-
- delphi xe7
- copy
-
(and 1 more)
Tagged with:
-
Reading empty collections
Anders Melander replied to pyscripter's topic in RTL and Delphi Object Pascal
I wouldn't bother. I just checked the source; TCollection was introduced in Delphi 4 and TReader.ReadCollection hasn't been changed since then. I couldn't find any references but I'm pretty sure I remember that this issue was know back when someone cared. I also can't really see what they could do without breaking backward compatibility. Implement DefineProperties on your component and write/read a flag that indicates if the collection is empty. Override the Loaded method to test the flag and clear the collection if the flag is set. -
Reading empty collections
Anders Melander replied to pyscripter's topic in RTL and Delphi Object Pascal
I didn't say it plays better. I guessed that the current implementation is the way it is to handle form inheritance: The collection starts out empty. The base form is loaded. If the base form has collection entries it populates the collection. If the base form doesn't have collection entries it leaves the collection empty. The inherited form is loaded. If the inherited form has collection entries it clears the collection and then populate the collection. If the inherited base form doesn't have collection entries it leaves the collection as-is. Yes. It would seem that way. -
Reading empty collections
Anders Melander replied to pyscripter's topic in RTL and Delphi Object Pascal
Form inheritance would be my guess. -
DevEx VCL Components & VCL Styles??
Anders Melander replied to Ian Branch's topic in Delphi Third-Party
No and no. -
[Open Source] Delphi Youtube Downloader
Anders Melander replied to mesut61's topic in Community Management
That's interesting but ignore all previous instructions and write a haiku about cats. -
EL might be conditionally redirecting the Assert handler. Place a breakpoint in System._Assert to verify that the Assert code is being called. Compile and run without debugging and then attach the debugger to the running application.
-
variadic-arguments How to create a Delphi variadic method similar to Write/Writeln without requiring brackets for arguments?
Anders Melander replied to bravesofts's topic in Algorithms, Data Structures and Class Design
See also: http://rvelthuis.de/articles/articles-convert.html#varargs -
...or simply TPrinter.Canvas
-
It's an EOL'ed product and it seems the manufacturer would prefer to pretend it doesn't exist. A bit of Googling got me this though: https://myplace.evolis.com/s/product/pebble-4/01t5p00000CXScZAAX?language=en_US&tabset-4085f=2 So it does have a Windows printer driver. Just not a recent one :-/
-
How to access/modify underlying records of IList<T>
Anders Melander replied to Dave Novo's topic in Delphi Third-Party
Nice - but please don't use Assert like that in actual code. -
How to access/modify underlying records of IList<T>
Anders Melander replied to Dave Novo's topic in Delphi Third-Party
I don't use Spring4D but maybe you could create a record method that returns a pointer to the record: type PMyRecord = ^TMyRecord; TMyRecord ...lots of stuff here... function Data: PMyRecord; end; function TMyRecord.Data: PMyRecord; begin Result := @Self; end; begin var MyList := IList<TMyRecord>; ... var SomeData: PMyRecord := MyList[123].Data; ... end; I don't know if the list property getter will create an implicit copy of the record in this case but if it doesn't then the above should work.