The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,839 other subscribers

Archive for the ‘Software Development’ Category

delphi – How to simulate Windows Theme behaviour when TComboBox uses csOwnerDrawFixed or csOwnerDrawVariable? – Stack Overflow

Posted by jpluimers on 2013/04/17

Some notes if I ever want to do something like this.

In this case I worked around it by having the Items include different text (since I had object pointers in the TStrings anyway) so I could stick to the csDropDown Style.

A very easy way to show different string values than the Items is to set the Style property fromcsDropDown to csOwnerDrawFixed as Andreas Rejbrand has answered a few years ago.

The thing is: as soon as you do that, you loose Windows Theming support.
The same limitation applies to using csOwnerDrawVariable

These two Style values get translated into adding the CBS_OWNERDRAWFIXED orCBS_OWNERDRAWVARIABLE (in addition to CBS_DROPDOWNLISTstyles of the Windows COMBOBOX control.

In turn, CBS_OWNERDRAWFIXED or CBS_OWNERDRAWVARIABLE cause you to instantly loose the Windows theming support.

When you do full custom painting like a colour picker, that is all fine. But when you only want to replace the drawn text, it is not.

The Windows COMBOBOX control does not seem to have a way around this, so I’m wondering: how can you simulate the Windows theming from Delphi?

I assume it has to do with DrawThemedBackground, but it has been a while since I’ve done serious Delphi Control work, so any pointers on how to get started there are fine too (even if they invalidate my assumption).

share|edit|close|delete|flag
75% accept rate
1
Just change the text in the control and let Windows do the work. – David Heffernan Sep 9 at 11:08
@DavidHeffernan That is a lot of work, so I wonder if simulating the theming is less work. And it would be a good exercise to learn more about how the theming support actually functions. – Jeroen Wiert Pluimers Sep 9 at 11:14
2
up voted
I cannot imagine that ComboBox1.Items.Assign is harder than working out theming. Very easy to get themed painting wrong as you can see from the VCL. Windows gets it right. – David Heffernan Sep 9 at 11:38
@DavidHeffernan The problem is not the Assign, but the mapping back to what I want. But I appreciate your point. Just waiting to see if someone comes with an answer into the theming direction and if not, work on the mapping. – Jeroen Wiert Pluimers Sep 9 at 12:21
1
up voted
Can you work it out by reading the code for TComboBoxStyleHook. – David Heffernan Sep 9 at 13:13
I tried, not much success yet, but when I do, I will post. First some non work though (: – Jeroen Wiert PluimersSep 9 at 13:24
1
up voted
As david says, I really don’t see the point of your question. You’re doing it the hard slow way, instead of the fast easy way (Just change the item text?) – Warren P Sep 10 at 3:21
I simplified the question a lot. Doing the reverse mapping requires me to enumerate over all items, which I’d rather not do (especially since I’d need abstract that for multiple not so similar kinds of occasions that are in different parts of the class hierarchy). – Jeroen Wiert Pluimers Sep 10 at 11:03
 
@JeroenWiertPluimers But you need to do that mapping at some point. The text has to come from somewhere. – David Heffernan Sep 10 at 12:09
@DavidHeffernan But now I need to do the reverse mapping… It’s not impossible like a trapdoor, but it is impractical. But probably less impractical than doing the theming. – Jeroen Wiert Pluimers Sep 10 at 14:19
1
up voted
If you can work the text out to paint it, you can work the text out to stuff into the combo box items. – David Heffernan Sep 10 at 14:42
@DavidHeffernan stuffing the text into the items isn’t the problem. The reverse (getting the right underlying item back from that text) is. That’s my mapping problem, hence the reference to the trapdoor. – Jeroen Wiert Pluimers Sep 10 at 15:14
 
OK, now I understand. I guess at this point you wished you had a better separation between business logic and UI! – David Heffernan Sep 10 at 15:15
I usually want, as most code I maintain at clients has very bad separation. But in this case the separation is quite OK. The Business Layer gives me a TStrings with the Objects filled (it is pre-Delphi-2009, so no generics yet). That’s why I can get out the Text sou easy (: First I need to finish about a week of .NET work though. – Jeroen Wiert Pluimers Sep 10 at 16:03
 
I actually wish that I had a completely VCL-implementation of TComboBox if only due to the issues in the Standard Control ComboBox setting its item height however it wants. If I was stuck in your situation, I think I’d almost write my own TExtComboBox and its own VCL styles feature. – Warren P Sep 10 at 20:45
The comments by @DavidHeffernan did give me some thought. Since the Object instance references are already in the TStrings, I wrote a small function to return a new temporary TStrings that has the string values with the captions I needed and keep the Object references. Since it has the same item ordering, and same Object references I don’t need any mapping at all. Just need to make sure I free the new TStrings at the right moment. – Jeroen Wiert Pluimers Sep 10 at 21:24

add comment

–jeroen

via: delphi – How to simulate Windows Theme behaviour when TComboBox uses csOwnerDrawFixed or csOwnerDrawVariable? – Stack Overflow.

Posted in Delphi, Delphi XE2, Delphi XE3, Development, Software Development | 3 Comments »

[MonoDevelop] MonoDevelop and Xamarin Studio

Posted by jpluimers on 2013/04/16

Just in case you missed it too:

Xamarin Studio is MonoDevelop plus a set of add-ins. Those add-ins provide the required functionality for working with Android and iOS projects, and integrate some Xamarin services such as the Component Store.

The development of MonoDevelop will continue like it has been in the past. All the improvements which are not related to Xamarin’s commercial offerings will be done in MonoDevelop, and we have plans for a lot of them: code analysis, version control, debugger, etc. We are committed to keep evolving MonoDevelop, because a better MonoDevelop means a better Xamarin Studio.

MonoDevelop will also keep working on Linux. There may be some rough edges with MonoDevelop 4.0 on Linux, since for this release we put our focus on Mac and Windows, since that’s what Xamarin’s customers use. So if you find any problems please file bugs!

–jeroen

via: [MonoDevelop] MonoDevelop and Xamarin Studio.

Posted in .NET, Development, Mono for Android, MonoDevelop, MonoTouch, Software Development, Xamarin Studio | Leave a Comment »

excel “not enough storage is available to complete this operation (exception from hresult: 0x8007000e (e_outofmemory))” – Google Search

Posted by jpluimers on 2013/04/16

So I won’t forget to research this:

excel “not enough storage is available to complete this operation (exception from hresult: 0x8007000e (e_outofmemory))” – Google Search.

Somehow this occurs with Excel and the .NET app only having a few dozen megabytes of memory in use, so the cause must be something a lot more simple than “out of memory”.

It is a complex export, but I might just be able to get this going using ADO.NET, and make sure it is not a 60+k rows or 60+k characters issue.

–jeroen

Posted in .NET, .NET 4.0, C#, C# 4.0, Development, Excel, Office, Power User, Software Development, Visual Studio 2010, WinForms | Leave a Comment »

Reminder to self: you cannot repeatedly draw anti-aliased text without damaging the background

Posted by jpluimers on 2013/04/11

A small duh moment when I found this out myself the hard way: when repeatedly drawing anti-aliased text, it will alter the background on each draw.

So you cannot do that. Not in Delphi, not in .NET, not in Cocoa, nowhere (:

–jeroen

via: delphi – “Additive” text rendering on TCanvas? – Stack Overflow.

Posted in .NET, Delphi, Development, FireMonkey, Software Development, User Experience (ux), WinForms, WPF, XNA | 7 Comments »

Delphi + ADO + dBase – Stack Overflow

Posted by jpluimers on 2013/04/10

For my research queue:

I should look at the below ConnectionStrings to access dBase with ADO from Delphi, If I ever need to do that.

Thanks Cromulent for asking, Nelson for editing and Pieter for answering:

Microsoft dBase ODBC driver

Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;OLE DB Services = -1;Extended Properties=dBase IV;Dbq=c:\mypath

doing operations like ADOTable1.Open are very fast (good) but GetIndexNames returns nothing (bad).

Microsoft Jet OLEDB 4.0 driver

Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;OLE DB Services=-1;Data Source=c:\mypath

doing operations like ADOTable1.Open are exceedingly slow (bad) while GetIndexNames does return index names the way it should (good).

How do I get both speed and the index info via ADO for the dBase tables?

Microsoft Paradox Driver 7.x

“We use the following connection string which works really well.”

Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="Driver={Microsoft Visual FoxPro Driver};UID=;SourceDB=c:\mypath;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

–jeroen

via Delphi + ADO + dBase – Stack Overflow.

Posted in Delphi, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 5, Delphi 6, Delphi 7, Delphi XE, Delphi XE2, Delphi XE3, Development, Software Development | 8 Comments »

Pascal/Delphi parsers and grammars

Posted by jpluimers on 2013/04/09

A few interesting links for my archive:

–jeroen

Posted in Delphi, Development, FreePascal, Pascal, Software Development | 3 Comments »

More Old Micro Cornucopia issues on BitSavers from 1987 and 1988

Posted by jpluimers on 2013/04/08

Last quarter, 11 issues of Micro Cornucopia appeared on BitSavers including the final May 1990 issue.

This month, another 7 issues appeared, most of which cover a form of Pascal in one or more of the articles and advertisements:

A fun thing to notice are the advertisements for Modula-2. Logitech Modula-2. Yes though the Logitech Wikipedia page does not mention it at all, Logitech didn’t only sell mice, keyboards and web-cams. They had more products. Being Swiss, they were big in Modula-2. And Bitsavers has a PDF of that too: Logitech_Modula-2_86_1.0_Feb84.pdf

The only issues still to be scanned are #28 till #32.

–jeroen

via: New Micro Cornucopia issues on BitSavers including the Final May 1990 issue « The Wiert Corner – irregular stream of stuff.

Posted in Assembly Language, BitSavers.org, C, C++, Delphi, Development, History, Pascal, Software Development, Turbo Assembler, Turbo Pascal, x86 | Tagged: , , , , | 2 Comments »

Handling trailing backslash & directory names with spaces in batch files – Stack Overflow

Posted by jpluimers on 2013/04/04

Thanks Jeb for answering this:

You can solve it with delayed expansion, because delayed expansion works different than percent expansion.

:START
setlocal EnableDelayedExpansion
@echo What folder do you want to process? (Provide a path without a closing backslash)
set /p datapath=

::Is string empty?
IF X!datapath! == X GOTO:START

::Does string have a trailing slash? if so remove it
IF !datapath:~-1!==\ SET "datapath=!datapath:~0,-1!"

echo !datapath!

It expands later than the percent expansion, and after the delayed expansion no more parsing is done, so even spaces or special characters have any effect.

–jeroen

via:

Posted in Batch-Files, Development, Power User, Scripting, Software Development | Leave a Comment »

autoscrolling memo in delphi – Stack Overflow

Posted by jpluimers on 2013/04/03

Just found this great answer by vcldeveloper to autoscroll a readonly logging memo in Delphi which works from Delphi 1 and up (:

For such a simple task, you don’t need to buy a commercial component! All you need to do is to send an EM_LINESCROLL message to that memo control, to make it scroll to the last line:

procedure ScrollToLastLine(Memo: TMemo);
begin
  SendMessage(Memo.Handle, EM_LINESCROLL, 0,Memo.Lines.Count);
end;

If your memo is read-only to users and is updated automatically by the application, you can put a call to the above procedure in its OnChange event-handler, so that whenever the text inside the memo is changed, it is automatically scrolled down to the last line.

–jeroen

via: autoscrolling memo in delphi – Stack Overflow.

Posted in Delphi, Delphi 1, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7, Delphi x64, Delphi XE, Delphi XE2, Delphi XE3, Development, Software Development | 9 Comments »

.NET/C# – Some notes in IGrouping (via: Grouping in LINQ is weird (IGrouping is your friend) – Mike Taulty’s Blog)

Posted by jpluimers on 2013/04/02

IGrouping interface diagram (click to enlarge)

IGrouping interface diagram (click to enlarge)

One of the things most people find hard to use in LINQ is GroupBy or the LINQ expression group … by (they are mostly equivalent).

When starting to use that, I was also confused, mainly because of two reasons:

  1. GroupBy returns a IGrouping<TKey, TElement> generic interface, but the classes that implement it are internal and not visble from outside the BCL (although you could artificially create your own).
    This interface extends the IEnumerable<TElement> in a full “is a” fashion adding a Key member.
    This has two consequences:

    1. Because it is a “is a” extension of the IEnumerable<TElement>, you can use foreach to enumerate the TElement members for the current group inside the grouping.
      No need to search for a Value that has the Elements, as the Group is the Elements.
    2. The Key member is indeed the current instance of what you are grouping over. Which means that Count<TElement>, are for the current group in the grouping.
  2. The LINQ expression syntax for grouping on multiple columns is not straightforward:
    1. Grouping on multiple columns uses a bit different syntax than you are used from SQL.
      (Another difference is that SQL returns a set, but groups are IEnumerable)
    2. You also need to be a bit careful to make sure the group keys are indeed distinct.

Most people don’t see the IGrouping<TKey, TElement> because they use the var keyword to implicitly the LINQ result.
Often – when using any anonymous type – var is the only way of using that result.
That is fine, but has the consequence that it hides the actual type, which – when not anonymous – is a good way of seeing what happens behind the scenes.

David Klein gave an example for the multi column grouping and also shows that if you use LINQPad, you can actually see the IGrouping<TKey, TElement> in action.

Mike Taulty skipped the Group By Syntax for Grouping on Multiple Columns in his Grouping in LINQ is weird (IGrouping is your friend). So my examples include that.

Note that I don’t cover all the LINQ group by stuff, here, for instance, I skipped the into part.
There are some nice examples on MSDN covering exactly that both using Method based and Expression based LINQ.

The examples are based on these two classes, similar to what Mike did. Read the rest of this entry »

Posted in .NET, .NET 3.5, .NET 4.0, .NET 4.5, C#, C# 3.0, C# 4.0, C# 5.0, Development, LINQ, Software Development | Leave a Comment »