Legacy

When I did redesign of site into blog format some things got lost. I was quite surprised that those files, not linked from my site, were still getting bunch of hits, especially legacy VB 6.0 code. It seems that there are still some people using it.

By popular demand, here is all that code in single archive. Do note that even most youngest code is from 2004 with most of code being even older. I bring you also original descriptions, nothing is modified in any way.

Download is here.

VB.NET 2.0

  • DnDTabControl How to reorder TabPages inside TabControl.
  • Highlander Detecting already running program and letting first instance know that.

VB.NET 1.1 DLLs

  • Medo This DLL is compiled version of classes given on these pages and some classes without source code. There is Profile class that lets you save Form position, ListView Columns witdh and more. OleDb class lets you to easily perform one line queries. There are few more CRC algorithms including CRC8. There is also many more classes that can prove to be useful. There are not too many samples now but more of them will come.

VB.NET 1.1 Classes

  • BigOFD OpenFileDialog class implemented in .NET has small problem. Buffer size is too small to handle more than few hundred files or even less. This replacement was designed to give you direct access to Windows API and to allow custom buffer sizes. It is mostly compatible with .NET OpenFileDialog so no porting problems should occur.
  • Bitwise This class gives you ability to perform unsigned Shift left, Shift right, Rotate left and Rotate right bitwise operations over Integer and Short (aka Int16 and Int32) data types. This is very usefull in some algorithms that must be implemented in unsigned logic that is currently unupported by Visual Basic.
  • COM This class can be used to perform read and write operations on serial communication ports (COM). It has basic example until I gather some time to make better one.
  • CRC-16 This class gives you ability to check data integrity with CRC16 algorithm.
  • CRC-32 This class gives you ability to check data integrity with CRC32 algorithm.
  • RC4 This class enables you to crypt your data using fast RC4 algorithm.
  • Registry VB.NET includes its own vision of registry access. This vision makes everything possible but its drawback is in number of code lines for most simple things. By using this class you can write/read REG_DWORD and REG_SZ data types in one line.
  • TagItem First ListBox control use in .NET was very confusing for me. Like, I am sure many of you, I used ItemData to fill in ID of somekind. But there is no ItemData in Kansas anymore so “Dorothy” had to find another solution. It took some time to see that new “Items.Add” formula takes Object as argument. From there, everything was downhill. By using Text and ID as an argument, this class can be successfully used to retrieve same information later. One Object argument is added for “just in case” situations.

VB.NET 1.1 Macros

  • VB6ver Enables you to use VB6 style versioning in .NET enviroment.

Java

  • DateTime 1.10 When I started to learn Java, its date management model drove me crazy. It was too much complicated for simple calculations. Here is class that enables date/time management in simple .NET alike class.
  • Road to Java This script is diary of differences I notice while learning Java. It is not complete nor it will ever be but I will work on it.

VB 6.0 Classes

  • APIFile This class was developed to open files via API which has advantage of being able to trim them by using Length property.
  • CRC32 This class gives you ability to check data integrity with standard CRC32 algorithm.
  • SHA-1 This class enables you to encrypt your passwords with SHA-1 hash (one-way) algorithm.
  • Window You can enumerate open windows by using this class.
  • XY This class enables you to draw in X-Y coordinate system. Usefull for drawing mathematical functions graphs.

VB 6.0 Controls

  • CmnDlg Complete substitude for CommonDialog control. No .ocx needed.
  • Contain This control can be used as container for other controls.
  • Progress Complete substitude for ProgressBar control. No .ocx needed.
  • TextComplete This control gives you AutoComplete ability.
  • TrayIcon This control gives you option to show icons in Tray notification area.

VB 6.0 Modules

  • Browse This module enables you to show Browse dialog.
  • CRC16 This module gives you ability to check data integrity with standard CRC16 algorithm.
  • CRC32 This module gives you ability to check data integrity with standard CRC32 algorithm.
  • Date This module enables you to find out when is Easter.
  • HrBox This module enables you to show Croatian MsgBox and InputBox.
  • RC4 This module enables you to crypt your data using fast RC4 algorithm.
  • Registry This module enables you to access Windows registy.
  • SHA-1 This module enables you to encrypt your passwords with SHA-1 hash (one-way) algorithm.
  • Shuffle This module contains functions for shuffling elements of zero-based arrays (for playlists, cards, etc.).
  • ShutDown This module enables you to shut down your computer or put it in sleep mode from your program.
  • Swap This module enables you to Swap variables in single instruction.

Keyboard Enlargement

Illustration

I got new monitor for my Windows Media Center machine and I stumbled upon curious issue.

I control this machine via on-screen keyboard and on new monitor it’s window was too small and of course there was no way of resizing it. That is, there was no GUI way of resizing it. I could always try to resize it programatically with a little help of SetWindowsPos function.

It was as simple as running on-screen keyboard, getting monitor it is on (in order to calculate size, it is not really a must) and then resizing it to desired size:

var process = new Process();
process.StartInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "osk.exe");
process.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
process.Start();

process.WaitForInputIdle();

var win32Rect = new NativeMethods.tagRECT();
NativeMethods.GetWindowRect(process.MainWindowHandle, out win32Rect);
var originalRect = new Rectangle(win32Rect.left, win32Rect.top, win32Rect.right - win32Rect.left + 1, win32Rect.bottom - win32Rect.top + 1);

var screen = Screen.FromRectangle(originalRect);
var newWidth = (int)(screen.WorkingArea.Width / 2.5);
var newHeight = (int)(newWidth / 2.5);

NativeMethods.SetWindowPos(process.MainWindowHandle, IntPtr.Zero, 0, 0, newWidth, newHeight, NativeMethods.SWP_NOMOVE | NativeMethods.SWP_NOZORDER);

As far as size is concerned I opted for 40% of screen width (width / 2.5) and 40% of that was to be assigned as height. Exact numbers are not really important but those were ones that I liked the most. It was enough to run this program only once since Microsoft’s On-screen Keyboard will remember previous size upon exit.

If you need bigger on-screen keyboard for Windows XP, try it.

Losing Battle

Illustration

Apple is screwing their customers again. This time literary - there is new screw head called “Pentalobe” that is slowly working it’s way in Apple products.

Current effect is that nobody can open iPhone without risking damage to screw but I wonder what net effect will be. There are already products that enable you to replace that “secure” screw with normal Phillips one. I wonder how long it will take for everybody to get proper pentalobe screwdriver. A week? A month?

Mono, Ubuntu and Clipboard

Reading clipboard in .NET is fairly straightforward.

   var text = Clipboard.GetText();

Once you stumble into Mono under Linux, things tend to change. Clipboard works only inside your application, rest of system works on different plane altogether. In order to get text from system clipboard we need to have following code:

    Gtk.Clipboard clippy = Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false));
    var text = clippy.WaitForText();

And here comes the problem. These functions need reference to both gdk-sharp and gtk-sharp. Unfortunately this also means that you cannot run it without MONO runtime. You can forget running application under Microsoft’s .NET Framework. Even if we don’t use those functions our applications will fail upon startup since it cannot resolve all references.

I solved this issue by having separate .dll for clipboard operations on Linux but I haven’t created any reference to it. In order to determine clipboard content I use reflection to load it (only if we are on Mono):

private string GetClipboardText() {
    if (IsRunningOnMono) {				
        var fullExePath = new FileInfo(Assembly.GetExecutingAssembly().Location);
        var gtkAss = Assembly.LoadFile(Path.Combine(fullExePath.DirectoryName, "GtkClipboard.dll"));
        var assMethod = gtkAss.GetTypes()[0].GetMethod("GetGtkText");
        txtClipboard.Text = assMethod.Invoke(null, new object[] { }) as string;
    } else {
       txtClipboard.Text = Clipboard.GetText();
    }
}

private static bool IsRunningOnMono {
    get {
        return (Type.GetType("Mono.Runtime") != null);
    }
}

And what should we put in our .dll? It ends up that it is quite simple code:

public static class Clipboard {
    public static String GetGtkText() {
        Gtk.Clipboard clipboard = Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false));
        if (clipboard != null) {
            return clipboard.WaitForText();
        } else {
            return "";
        }
    }
}

P.S. You will notice here that reflection code loads first class that comes in array. Since I only have one class in that whole .dll this is not an issue. If you add more classes to that assembly take care that you select correct one.

Showing Form in Mono

When I develop application that should be usable on Linux I usually program it in C# with Visual Studio. From time to time I test it with Mono Migration Analyzer. End result is usually runnable under Linux after some further debugging. This time I had to create application that would be used primarily under Linux so I took different approach - MonoDevelop.

Most difficult thing to get used to after transfer from Visual Studio world is lack of Windows Forms designer; everything needs to be done by hand. Doing that I stumbled upon strange behavior. Take this simple code:

private void SomeButton_Click(object Sender, EventArgs e) {
    using (var frm = new SomeForm()) {
        frm.ShowDialog(this);
    }
}
...
internal class SomeForm : Form {
}

This code is dead simple - there is no chance of error. However this code also doesn’t work properly under Mono 2.6 (I haven’t checked other versions). Form will be shown first time button is clicked but not second time. What puzzled me the most is fact that I knew that that ShowDialog should work - other .NET application that I used under Linux worked perfectly.

First rule of bug-triage is to trim code as much as possible to determine which line is problematic one - there was nothing to trim here and I still had a bug. As it turned out, this bug shows it’s ugly head only if you don’t have any controls on Form. As soon as first control is added everything works as expected. I haven’t seen this behavior in my other applications since I never had an empty form to show.

It just shows that testing smallest possible working code is not always an answer.