[yoy - Why-O-Why]yoy - “Why-O-Why”

» frame | home browse filter search | refresh | log on

  printed maandag 20 mei 2013 4:42:07 from www.yoy.be

Building query...

filter...

user: StijnSanders commented on: 17/04/2013 23:14:43 DirFind

verion 2.0.3.333
- Multi-line matches show first line when double-click matching file

"database locked" errors with SQLITE_CONFIG_SERIALIZED

I've been impressed by sqlite3 ever since I get to know about it. It's open source, and even more it's really put in the public domain completely avoiding the licensing headache. I haven't read the source in great detail, but as I understand it it's all in a single big file! Even how it works internally is impressive.

Since I didn't like the options available, I created my own very thin wrapper for sqlite3.dll without much trouble. Only in this one multi-threaded application, I've run into an occasional "database locked" error, so I had to search documentation and source for what I can do about it.

Working with other database solutions, I've had the common sense of using a database connection for each thread, so each could work with the database undisturbed by eachother. As it turns out this is not required with sqlite3! As stated with SQLITE_CONFIG_SERIALIZED, which is the default setting, you're better off using a single connection over all threads. Indeed in my case it solved the "database locked" errors.

location: Application Development > Data Storage > SQLite
created: 23/03/2013 22:36:26 « modified: 23/03/2013 22:36:26 weight: 0
tokens: delphi

How to create a shell extension context menu.

I've put it up here, but since it's a pretty good boiler plate code, I'll put it up here as well. Include a unit like this one into an ActiveX library. I especially had a though time to get the values right that are based on idCmdFirst and get sent back when a menu item is invoked. Something that gives pretty strange results if you don't get it right.

unit demoContextMenu;

interface

uses
  Windows, Classes, ActiveX, ComObj, ShlObj;

type
  PItemIDList=LPCITEMIDLIST;

  { TContextMenu }
  TContextMenu = class(TComObject, IShellExtInit, IContextMenu)
  private
	Files:TStringList;
  protected
	{ IShellExtInit }
	function IShellExtInit.Initialize = SEIInitialize;
	function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
	  hKeyProgID: HKEY): HResult; stdcall;
	{ IContextMenu }
	function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
	  uFlags: UINT): HResult; stdcall;
	function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
	function GetCommandString(idCmd: UINT_Ptr; uType: UINT; pwReserved: PUINT;
	  pszName: LPSTR; cchMax: UINT): HResult; stdcall;
  public
	procedure Initialize; override;
	destructor Destroy; override;
  end;

const
  Class_ContextMenu: TGUID = '{put a new GUID here by pressing Ctrl+Shift+G}';

implementation

uses ComServ, SysUtils, Registry;

procedure TContextMenu.Initialize;
begin
  inherited;
  Files:=TStringList.Create;
end;

destructor TContextMenu.Destroy;
begin
  Files.Free;
  inherited;
end;

function TContextMenu.SEIInitialize(pidlFolder: PItemIDList;
  lpdobj: IDataObject; hKeyProgID: HKEY): HResult; stdcall;
var
  StgMedium: TStgMedium;
  FormatEtc: TFormatEtc;
  i,c:integer;
  s:string;
begin
  if lpdobj=nil then Result:=E_INVALIDARG else
   begin
	FormatEtc.cfFormat:=CF_HDROP;
	FormatEtc.ptd:=nil;
	FormatEtc.dwAspect:=DVASPECT_CONTENT;
	FormatEtc.lindex:=-1;
	FormatEtc.tymed:=TYMED_HGLOBAL;

	Result:=lpdobj.GetData(FormatEtc,StgMedium);
	if not(Failed(Result)) then
	 begin
	  c:=DragQueryFile(StgMedium.hGlobal,$FFFFFFFF,nil,0);
	  for i:=0 to c-1 do
	   begin
		SetLength(s,1024);
		SetLength(s,DragQueryFile(StgMedium.hGlobal,i,PChar(s),1024));
		Files.Add(s);
	   end;
	  ReleaseStgMedium(StgMedium);
	  Result:=NOERROR;
	 end;
   end;
end;

function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
  idCmdLast, uFlags: UINT): HResult; stdcall;
var
  h:HMENU;
  i:integer;
begin
  i:=1;
  h:=CreatePopupMenu;
  AppendMenu(h,MF_STRING,idCmdFirst+i,'Menu item one');      inc(i);
  AppendMenu(h,MF_STRING,idCmdFirst+i,'Menu item two');      inc(i);
  AppendMenu(h,MF_STRING,idCmdFirst+i,'Menu item three');    inc(i);
  InsertMenu(Menu,indexMenu,
	MF_BYPOSITION or MF_POPUP or MF_STRING,h,'DemoContextMenu');
  Result:=i;
end;

function TContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
  stdcall;
begin
  Result := E_FAIL;
  //not called by application
  if HiWord(Integer(lpici.lpVerb))=0 then
	begin
	  Result := NOERROR;
	  case LoWord(Integer(lpici.lpVerb)) of
		1:;//perform action one (use data in Files:TStringList)
		2:;//perform action two
		3:;//perform action three
		else Result := E_INVALIDARG;
	  end;
	end;
end;

function TContextMenu.GetCommandString(idCmd: UINT_Ptr; uType: UINT;
  pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult; stdcall;
begin
  if idCmd=0 then
   begin
	if (uType=GCS_HELPTEXTW) then
	  StrCopy(pszName,'Perform one of several functions on files');
	Result:=NOERROR;
   end
  else
	Result:=E_INVALIDARG;
end;

type
  TContextMenuFactory = class(TComObjectFactory)
  public
	procedure UpdateRegistry(Register: Boolean); override;
  end;

procedure TContextMenuFactory.UpdateRegistry(Register: Boolean);
var
  ClassID:string;
  r:TRegistry;
begin
  if Register then
   begin
	inherited UpdateRegistry(Register);

	ClassID := GUIDToString(Class_ContextMenu);
	CreateRegKey('*\shellex', '', '');
	CreateRegKey('*\shellex\ContextMenuHandlers', '', '');
	CreateRegKey('*\shellex\ContextMenuHandlers\DemoContextMenu', '', ClassID);

	CreateRegKey('Folder\shellex', '', '');
	CreateRegKey('Folder\shellex\ContextMenuHandlers', '', '');
	CreateRegKey('Folder\shellex\ContextMenuHandlers\DemoContextMenu', '', ClassID);

	if Win32Platform=VER_PLATFORM_WIN32_NT then
	 begin
	  r:=TRegistry.Create;
	  try
		r.RootKey:=HKEY_LOCAL_MACHINE;
		r.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions',True);
		r.OpenKey('Approved',True);
		r.WriteString(ClassID,'DemoContextMenu Shell Extension');
	  finally
		r.Free;
	  end;
	 end;

   end
  else
   begin
	DeleteRegKey('Folder\shellex\ContextMenuHandlers\DemoContextMenu');
	DeleteRegKey('*\shellex\ContextMenuHandlers\DemoContextMenu');

	inherited UpdateRegistry(Register);
   end;
end;

initialization
  TContextMenuFactory.Create(ComServer, TContextMenu, Class_ContextMenu,
	'', 'DemoContextMenu Shell Extension', ciMultiInstance, tmApartment);
end.

location: Application Development > Programming Languages > Object Pascal > Delphi > ActiveX / COM objects
created: 12/11/2012 16:41:31 « modified: 12/11/2012 16:42:58 weight: 0
tokens: delphi

user: StijnSanders commented on: 18/10/2012 10:05:40 Create a shortcut from code.

See also here for more information on the IShellInfo interface:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb774950(v=vs.85).aspx

user: StijnSanders commented on: 10/05/2012 21:06:57 DirFind

v2.0.2.300
- issue expanding closest line above for lower indentation-levels over blank lines
- shell context menu on files/folders items
- command line parameters support:
    DirFind [<options>] <search path> [<filter filenames> [<exclude filenames> [<search pattern>]]]
    options:
      /i  ignore case
      /m  multi line
      /a  count all matches
      (/-... to disable, default settings are loaded from previous session)

Force Application.Run to skip the message loop (from within OnCreate event handler).

Warning: this is a very specific hack an may not apply to other situations.

For a number of projects that check for an update of the program executable on the central file server, from within the main form's OnCreate event handler, I was searching for a way to 'skip' Application.Run; when an update is found. I was using "raise EAbort.Create('Auto-update available.');" already to skip the remainder of the OnCreate event handler, but back in the project source (.dpr), Application.Run would start and perform the message loop. I used PostQuitMessage before, but that doesn't seem to always work, a better way would be to skip the message loop altogether.

I used "if SelfUpdateAvailable then Application.Run;" for some time, but in any new project that would use the auto-update mechanism, you would have to remember to put it in, or the support-calls after the first update for the program would remind you, or have you wondering first what's wrong with the auto-update this time. Anyway, it's better to leave the .dpr just the way Delphi hands it to you since it will modify it later when you add forms or data modules.

So I figured out I could disarm Application.Run by calling this from the 'start auto update' code:

  Application.ControlDestroyed(Application.MainForm);

This causes Application.MainForm to be unassigned, and Application.Run to skip starting the message loop, mission accomplished.

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 10/05/2012 13:13:32 « modified: 10/05/2012 13:14:52 weight: 0
tokens: delphi

user: StijnSanders commented on: 12/04/2012 18:09:43 DirFind

v2.0.1.290
- bug reading UTF16/UCS2 files
- issue updating display on abort

user: StijnSanders commented on: 5/04/2012 21:22:21 DirFind
token: delphi

v2.0.0.288
I've switched back to Delphi. The .Net version had trouble running more than three threads, and behaved strangly when exceptions occur. The option to use three regex'es in one run is gone, but there's an option now to use Execute instead of Test showing both the number of files that match, and the exact total number of matches in these files.
Also new is that when you double-click a matching line (double-click a file-node to get these), you not only get the five preceding and succeding lines, you also get the lowest preceding line of each lower level of indentation. It's hard to explain, but in most languages you should get the lines that starts the scope the line is in: namespace, function, method, loop or condition branch.

user: StijnSanders commented on: 30/03/2012 21:57:46 md5.pas
token: (friendly-url)

(md5)(md5/)(sha1)(sha1/)

user: StijnSanders commented on: 16/02/2012 20:28:59 md5.pas

 Code in a slightly modified form also used here: https://github.com/stijnsanders/TMongoWire/blob/master/mongoAuth.pas

user: StijnSanders commented on: 16/02/2012 20:27:10 md5.pas
token: (friendly-url)

(md5)(md5/)

md5.pas

This is odd, it looks like there isn't an open source md5.pas unit. And by open source I mean under a permissive license or without copyright or licensing. So I set out to write my own and share it here. I based it on the original RFC, and even more the description than the reference implementation, because it uses a few of those C tricks I don't like. I hope it's performant enough, in case you're demanding performance of it. I've done some testing myself, but if you detect any kind of issue, please let me know.

md5.pas with MD5Hash for strings, sometimes used with passwords

md5Stream.pas with MD5HashFromStream which takes any kind of stream (TFileStream, TMemoryStream...), and optionally a preset number of bytes to take from the stream (from the current position!).

Enjoy. 

Update: since MD5 and SHA1 are really similar, I've done the same for SHA1 and added sha1.pas and sha1Stream.pas.
Update 2: since I needed it for something else, I've added RIPEMD160 as well. And while I'l at it SHA256 as well

md5.zip (12KB)

location: freeware
created: 16/02/2012 20:26:41 « modified: 14/03/2013 21:24:12 weight: 0
tokens: delphi (friendly-url)

COM/ActiveX objects and Windows Vista and newer

Applications that provide one or more ActiveX/COM automation objects, created with older versions of Delphi, running without administrative privileges, throw an EOleSysError when strarting up (typically from within the Application.Initialize;). This is because the application will try to register its type library and class registrations when it starts. Add this unit to the project to silent this error at run-time:

unit comFixW6;

interface

implementation

uses Windows, SysUtils, ComObj;

var
  SaveInitProc:pointer=nil;

procedure FixComInitProc;
begin
  try
    if SaveInitProc<>nil then TProcedure(SaveInitProc);
  except
    on e:EOleSysError do if e.ErrorCode<>TYPE_E_REGISTRYACCESS then raise;
  end;
end;

initialization
  SaveInitProc:=InitProc;
  InitProc:=@FixComInitProc;

end.

location: Application Development > Programming Languages > Object Pascal > Delphi > ActiveX / COM objects
created: 2/02/2012 21:55:51 « modified: 2/02/2012 22:01:41 weight: 0
tokens: delphi

user: anonymous user commented on: 31/01/2012 15:56:53 CreateProcessAsUser/CreateProcessWithLogon

Merci,

hope this works to run a third party application (without gui) from within a service :)

 

Printer.Canvas is not threadsafe!

What a strange discovery I made today. I was hunting down a weird exception we noticed in the logs of the live system.

It turns out that a 'global' callback procedure is being called when you use Printer.Canvas (Printer.Canvas.StretchDraw in my case) by the GDI subsystem. The default AbortProc in Printers.pas calls Application.ProcessMessages, which was causing trouble in my case.

There's a quick workaround:

function MyAbortProc(Prn: HDC; Error: Integer): Bool; stdcall;
begin
  Result := not FPrinter.Aborted;
end;

And then right after Printer.BeginDoc; call SetAbortProc(Printer.Canvas.Handle,MyAbortProc);

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 26/01/2012 19:46:39 « modified: 26/01/2012 19:46:39 weight: -200
tokens: delphi

user: StijnSanders commented on: 14/12/2010 15:24:20 TSQLite
token: (friendly-url)

(TSQLite)

TSQLite

An alternative SQLite3.dll wrapper

location: freeware
created: 14/12/2010 15:23:58 « modified: 14/12/2010 15:23:58 weight: 0
tokens: delphi (friendly-url)

user: StijnSanders commented on: 14/12/2010 15:23:21 TMongoWire
token: (friendly-url)

(TMongoWire)

TMongoWire

Delphi MongoDB Driver

A Delphi driver to access a mongoDB server.
It maps variables onto Delphi variables of type OleVariant, which resembles the loose typing of JavaScript a lot.
There are two main units and three main object to enable access to a mongo DB server:

bsonDoc.pas
  TBSONDocument = class(TInterfacedObject, IBSONDocument, IPersistStream)

  function BSON:IBSONDocument; overload;
  function BSON(x:array of OleVariant):IBSONDocument; overload;

mongoWire.pas
  TMongoWire=class(TObject)

  TMongoWireQuery=class(TBSONDocumentsEnumerator)

Additional tools

bsonUtils.pas
  function BsonToJson(Doc:IBSONDocument):WideString;
    Converts a BSON document into a JSON string.
  function JsonToBson(jsonData:WideString):IBSONDocument;
    Converts a JSON string into a BSON document.
  procedure JsonIntoBson(jsonData:WideString;doc:IBSONDocument); overload;
    Parses a JSON string and adds any keys to an existing BSON document, overwriting the value if a key already exists.
  procedure JsonIntoBson(jsonData:WideString;doc:IBSONDocument;var EndIndex:integer); overload;
    Parses only the first JSON object from a string into an existing BSON document, and returns the index into the string where the JSON object ends.
    Use this method to iterate over a list of JSON strings. (See also IBSONDocument.Clear)

location: freeware
created: 2/12/2010 10:05:35 « modified: 24/06/2012 21:39:02 weight: 0
tokens: delphi (friendly-url) references:      

user: StijnSanders commented on: 8/11/2010 21:58:23 How to set the thread display name for the thread list deb...

 See also http://nldelphi.com/Forum/showthread.php?t=36655

How to set the thread display name for the thread list debug window

This little trick appears to work in the Delphi debugger also! Use this code to set the debug display name for the current thread:

interface


function IsDebuggerPresent: BOOL; stdcall;

implementation


uses
Windows;


function
IsDebuggerPresent; external 'kernel32.dll';

procedure
SetThreadName(ThreadDisplayName:AnsiString);
var
  ThreadInfo:record
    dwType:LongWord;
    szName:PAnsiChar;
    dwThreadID:LongWord;
    dwFlags:LongWord;
  end;
begin
if IsDebuggerPresent then
begin
  ThreadInfo.dwType:=$1000;
  ThreadInfo.szName:=PAnsiChar(ThreadDisplayName);
  ThreadInfo.dwThreadID:=LongWord(-1);//calling thread
  ThreadInfo.dwFlags:=0;
  try
    RaiseException($406D1388,0,SizeOf(ThreadInfo) div SizeOf(LongWord),@ThreadInfo);
  except
    //
  end;
end;
end;

location: Application Development > Programming Languages > Object Pascal > Delphi > Debugging
created: 5/11/2010 0:25:47 « modified: 5/11/2010 0:45:47 weight: 0
tokens: delphi

user: StijnSanders commented on: 23/04/2010 23:54:33 DirFind

version 1.0.1.260
I finally got round to changing two things that were disturbing me about DirFind:

When searching a large structure of folders and sub-folders, I usually wanted to see the matching files in a certain sub-folder, but had to wait for the search running in the background to get to the directory I wanted to see. Now, when you expand the folder view, the background process is asked to move the folder you selected to the front of the queue. This feature will save me tuns of time. If larger files are being searched, this behaviour might not be apparent rightaway.

There was an issue using the replace feature on non-unicode text files. When re-writing the files, they got converted to UTF8. Now, if no unicode byte order marks are present, the file is re-written in the 'default' encoding, depending on your current regional settings. You may still get unexpected results on non-unicode files using another encoding than this default encoding.

user: StijnSanders commented on: 9/02/2010 0:52:04 BarcodeStuff

v1.0.2.255
I've finally figured out the deal about Code-A/B/C in encoding Code128 barcodes. I've added code that auto-switches between digits-interleaving as soon as four or more digits follow eachother, and the checksum character.

steverefethen.com

dit is handig, ik kende er een paar van deze lijst nog niet:
http://www.stevetrefethen.com/blog/DelphiIDEWisdom.aspx

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 20/09/2009 23:20:43 « modified: 20/09/2009 23:20:43 weight: 0
tokens: delphi

Installers upgraded to Setups!

I've (finally) re-done the 'installers' on a few of my freeware applications, thanks to InnoSetup:

They are a bit bigger now, but look much better, and have a full uninstaller and an entry listed in the 'add remove programs' control panel list.

location: www.yoy.be > users > StijnSanders
created: 28/08/2009 0:03:41 « modified: 28/08/2009 0:07:14 weight: 0
tokens: delphi weblog references:          

2009-2010 ICT Jaarboek: 'Delphi programma's draaien op een (niet gratis) runtime.'

Zeveraars! Uit het "2009-2010 ICT Jaarboek":

"Heel wat bedrijven gebruiken nog met success de zogenoemde 4GL-omgevingen uit de jaren '90. [...] Voorbeelden zijn Delphi, [...] Die programma's draaien alleen in hun eigen runtime-omgeving, en die is niet gratis."

Zeveraars! Een referentie naar hun bron moest je zo toch al niet verwachten, maar ze halen daarenboven RAD-omgevingen met 4GL-talen door elkaar! En programma's gemaakt met Delphi hebben helemaal geen run-time nodig!

Trouwens, hun link naar het jaarboek werkt niet eens!
En al hun 'nieuws' wist ik al lang... (en dan zwijg ik nog over dat ik ze niet eens in Google vond)
http://www.itprofessional.be/

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 20/08/2009 15:55:19 « modified: 20/08/2009 15:55:19 weight: 0
tokens: delphi

Colin Winson's Delphi Website

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 6/08/2009 14:00:35 « modified: 6/08/2009 14:00:35 weight: 0
tokens: delphi

Vreemd gedrag van dec() met Int64...

Tiens, wat ik hier nu plots ontdek... Ik ben aan xxmGecko bezig, een firefox-plugin-nsIProtocolHandler. Die werkt intern dus wel eens met een stream, en om echt grote streams te kunnen ondersteunen, gebruik je dus Int64's voor Size en Position...

Nu gebruik ik ook veel inc en dec. Waarschijnlijk een overblijfsel uit mijn (heel beperkte) assemblerjeugd. Dus dacht ik dat die ook wel veilig zijn om te gebruiken met Int64's.

Nu, kreeg ik tijdens het debuggen plots dingen die vastlopen en waardes in de buurt van 4294967295 in die Int64's! Voor wie het getal niet herkent, je krijgt het als je de laagste 32 bits op 1 zet. En alle bits die op 1 springen gebeurt wel eens als je een negatief cijfer krijgt.

Dat er een negatief cijfer komt in een stream position, is nog een ander probleem dat ik moet uitzoeken, maar waarom die Int64 maar de helft van de bits gekeerd krijgt inplaats van alle 64 (en dus echt een negatief cijfer zou weergeven) lijkt me een slecht bijverschijnsel van dec te gebruiken met Int64's.

Alle dec(A,B); vervangen met A:=A-B; dus vanaf nu!

location: Application Development > Programming Languages > Object Pascal > Delphi > Debugging
created: 25/06/2009 23:04:42 « modified: 25/06/2009 23:04:42 weight: 0
tokens: delphi

Currying in Delphi 2009

http://blogs.teamb.com/craigstuntz/2008/08/28/37831/

Yes! Nog nieuwe ingewikkelde manieren om onmogelijk te supporten code te schrijven! (Zaten we er op te wachten?) via

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 16/04/2009 0:16:24 « modified: 16/04/2009 0:16:33 weight: 0
tokens: delphi

WikiLocal+WikiEngine+SVN+xxm: comittable wiki!

Aah, vandaag is het eindelijk allemaal tesamen gekomen:

http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/demo2/svnwiki/

Ik wou al lang (al lang!) een oplossing om een wiki mee in SubVersion te stoppen, dus moest het in files. Het is een van de begin-redenen om aan WikiEngine te beginnen. Al was het dat ik PmWiki's syntax wou overnemen om gemakkelijk bestaande data te kunnen gebruiken/importeren.

Voordelen daarvan zijn:
- de wijzigingen kunnen in verschillende files/pagina's tesamen worden gecommit,
- de history zit kant en klaar in de svn history
- de wijzigingen/toevoegingen aan de documentatie kunnen direct tesamen met de wijzigingen/toevoegingen aan de source-code (en dus de functionaliteit) worden gecommit

Alleen hoe maak je het wat gemakkelijker om niet direct voor iedere working folder en/of branch een website te moeten opzetten naar de wiki? (Hou die URL's dan maar eens bij!) Dus is WikiLocal ontstaan, opnieuw met wat invloeden van PmWiki zoals groups en de side-bar, en toch met wat me opvallend afwezig leek in PmWiki: (snelle, bruikbare) backlinks!

Maar toch, voor bepaalde doeleinden (zoals de trunk of de release branch) is het nodig om een website te hebben om de content in de wiki te publiceren. En daar komt xxm van pas! Met WikiEngine.dll kan je de wiki-data omzetten naar HTML, en via doodgewone HTTP-GET calls kan je aan de HEAD revision van de wiki-data-files.

(Nu nog ergens vinden waar ik goedkoop xxm kan hosten...)

location: freeware > WikiEngine > WikiLocal
created: 16/03/2009 23:40:04 « modified: 16/03/2009 23:44:19 weight: 0
tokens: delphi references:              

The Future Of Delphi

Whow! moet ik thuis eens tijd voor nemen om te lezen:

http://www.theregister.co.uk/2009/02/04/verity_stob_delphi_syntax/

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 5/02/2009 13:18:31 « modified: 5/02/2009 13:18:31 weight: -200
tokens: delphi

user: StijnSanders commented on: 2/01/2009 15:22:15 BarcodeStuff

Yikes! Looks like it's about time I look into 2D barcodes as well!
http://en.wikipedia.org/wiki/QR_Code (especially the barcode on the billboard!)

Delphi For Fun

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 2/01/2009 11:00:48 « modified: 2/01/2009 11:00:48 weight: 0
tokens: delphi

Extended Class RTTI

Deze moet ik eens goed bekijken! Ik had al een vermoeden dat er zoiets moest in zitten met WebServices in Delphi aan het werk te zien... Maar als ik dus eens iets met xxm en WebServices zou willen doen, moet ik deze misschien ook oppikken. 

location: projects > xxm > feature requests > WebServices/XMLRPC support
created: 4/12/2008 22:34:38 « modified: 4/12/2008 22:34:38 weight: 0
tokens: delphi

FreeByte's Guide to Free Pascal Programming Tools

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 2/12/2008 23:14:50 « modified: 2/12/2008 23:14:50 weight: 0
tokens: delphi

HHF Innovations

Appears to have some nice sections on TWebBrowser (and DocHostUIHandler!)

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 28/11/2008 8:34:51 « modified: 28/11/2008 8:34:51 weight: 0
tokens: delphi

CodeGear: Trial and Free Versions

Wa! onderaan: Turbo Pascal! Als ik nog eens 16-bit wil programmeren, staat em dus gewoon hier!

(Misschien komt er een dag dat daar Delphi 7 bij komt?)

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 14/11/2008 8:22:13 « modified: 14/11/2008 8:22:13 weight: 0
tokens: delphi

user: StijnSanders commented on: 13/08/2008 14:46:19 Delphi

goh, waar zouden deze mensen zo tegenwoordig allemaal mee bezig zijn?
efg's Pillars of Delphi

Misschien bugje ontdekt in COM op Win2000 (nu nog!)

D'Oh! Het moet mij weer overkomen. Over wat een bug precies is kan gedicussieerd worden, maar ik denk dat ik iets heb gevonden. Maar dan in Windows 2000. En daar zijn ze waarschijnlijk wel al mee gestopt met aan werken...

Even schetsen waar het om gaat:

- IIS op Windows (IIS 5 op 2000, IIS 6 op XP, IIS 7 heb ik nog niet echt onder de vingers gehad, maar zou geen probleem mogen zijn)
- een xxm project van eigen makelij
- die gebruikt maakt van WikiEngine
- met een IWikiPageCheck implementatie

Nu, dat laatste is (in Delphi) gewoon een TInterfacedObject, wat op XP en 2003 (Vista heb ik nog niet kunnen proberen) goed werkt, op 2000 niet! Geeft een Access Violation op hetzelfde adres als de code pointer (Wat ook al verdacht is) als ik een instantie van de IWikiPageCheck implementatie probeer te assignen aan de WikiEngine instantie.

Ik heb rap eens geproobeerd om een type library toe te voegen, een IClassFactory ervoor te maken, the works, maar dat geeft een "Element not found" error... Daar kan ik misschien op verder zoeken.

Maar voorlopig denk ik er aan om misschien ook een "microsoftje te doen", en wil je hosten op Win2k, dan moet het zonder WikiEngine...

location: www.yoy.be > users > StijnSanders
created: 5/08/2008 20:41:47 « modified: 16/08/2008 11:31:57 weight: 0
tokens: delphi

Making Delphi programs Vista-Ready

Making Delphi programs Vista-Ready

voorlopig nog niet nodig gehad, maar altijd handig

location: spotted on the net > IT-related > development related
created: 27/06/2008 9:22:23 « modified: 27/06/2008 9:22:23 weight: 0
tokens: delphi

user: StijnSanders commented on: 9/06/2008 19:25:18 CodeGear: New IDE features since Delphi 7

en hier zijn ze ook a niet positief...
http://www.theregister.co.uk/2008/06/09/delphi_for_php_2_review/

user: StijnSanders commented on: 9/06/2008 16:09:06 CodeGear: New IDE features since Delphi 7

maar deze mens slaat dan weer de nagel op de kop:
http://delphiroadmap.untergrund.net/A_cross-platform_vision_for_Delphi/section2.html

CodeGear: New IDE features since Delphi 7

New IDE features since Delphi 7

Zucht... Ergens heb ik zo de indruk dat ze het beginnen te weten dat ze wat steun verloren zijn in hun 'aanname' van dotnet. En verder niets genoeg hebben herzien om het de moeite te maken om over te stappen van Delphi 7 naar iets nieuw.

MSBuild engine
zie ik het voordeel niet van in. Misschien pre en post build events? doe ik toch al met een build script
File explorer
zou ik ook niet gebruiken. Al was het om de relatieve paden in de dpr goed te krijgen
Live templates
Ctrl+J? dat zit toch al in Delphi 7 (en gebruik ik trouwens niet)
Block Completion
tja, lijkt me weinig voordeel te geven. Misschien is dat zoiets dat je onderbewust toch typt wat hij al doet in het begin, tot je het gewoon bent dat het er wel staat, en dan werk je nog even rap of vroeger
History tab
jikes, voor iedere keer je savet? ik doe toch al zelf Ctrl+S ongeveer iedere keer als ik van source file switch. Ik heb wat ik nodig heb met SVN, en ik commit zo als waar ik aan bezig ben naar behoren werkt
Enhanced debugging
CPU view panes? Zo diep moet ik normaal niet liggen debuggen...
en de rest zeggen we weinig
VCL guidelines
het weinige designen dat ik moet doen lukt best met de gewone grid.
code folding
gebruik ik niet
syncedit
gebruik ik niet, meer nog, ik reken er op dat deze die ik vergeet de compiler wel gaat oppikken!
searchable tool pallette
tja, zoveel tools heb ik niet! en ik heb alles al geschikt dat deze die ik veel nodig hebben op 3 tabs staan, andere tabs kies ik met rechter-klik in Delphi 7
editor line numbers
gebruik ik niet
line change indicators
gebruik ik niet, en ook: SVN en DirDiff
refactoring
tja. kan ik niet tegen zijn. hoewel ik het zelf (nog?) niet gebruik, snap ik dat er stukken werk zijn die je kan automatiseren, maar ik blijf er me aan storen dat het heel misschien wel eens fouten kan maken. En code die ik nog moet leren kennen, leer je goed door er zelf in te gaan refactoren, vind ik.
Integrated unit testing
gebruik ik niet. Ik ben niet overtuigd van unit testing, maar da's een andere duscussie.
UML
gebruik ik niet

location: Application Development > Programming Languages > Object Pascal > Delphi
created: 6/06/2008 21:24:27 « modified: 6/06/2008 21:24:27 weight: 0
tokens: delphi references:    

Ararat Synapse

Discovered this one, after stability problems with Indy 9... Never used anything since.

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites > Components
created: 27/05/2008 16:47:45 « modified: 27/05/2008 16:48:45 weight: 0
tokens: delphi

Delphi TIOBE rating

ho, interessant, een numerieke indicatie dat Delphi verrevan dood zou zijn

http://www.tiobe.com/content/paperinfo/tpci/Delphi.html

(via http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)

location: spotted on the net > IT-related > software related
created: 25/04/2008 14:32:48 « modified: 25/04/2008 14:36:38 weight: 0
tokens: delphi

TurboPower: Sorry We're Closed

ha! gewoon alles op sourceforge! van Async Pro had ik al gehoord, maar ze hebben blijkbaar nog allemaal leuke dingen! (Alleen Sleuth staat er dan weer niet tussen, tju)

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites > Components
created: 3/03/2008 12:46:22 « modified: 25/03/2008 10:51:56 weight: 0
tokens: delphi

How to debug a COM+ component in Delphi

Ha! en ik maar zoeken! Ik had gewoon 'Include remote debug symbols' niet aan staan! Blijkbaar heb je die wel nodig om

dllhost.exe /ProcessID:{...}

 te debuggen. Ik vond het al vreemd dat mijn exceptions wel doorkwamen, maar step/trace niet werkte. Natuurlijk verlies je tijd op zo'n dingen dingen...

http://dn.codegear.com/article/28416

location: Application Development > Programming Languages > Object Pascal > Delphi > Debugging
created: 26/02/2008 10:06:02 « modified: 26/02/2008 10:07:00 weight: 0
tokens: delphi

Joe White’s Blog » Delphi

Nice to see Delphi is far from dead.

location: Application Development > Programming Languages > Object Pascal > Delphi > Delphi Websites
created: 21/02/2008 9:20:08 « modified: 21/02/2008 9:20:08 weight: 0
tokens: delphi

user: StijnSanders commented on: 7/01/2008 22:04:16 BarcodeStuff

I provided some more explanation for the people at www.delphipages.com here:
http://www.delphipages.com/tips/thread.cfm?ID=1108

SourceForge.net: Gecko SDK for Delphi

oh! ah! If I would have all the time of the world! If! And if I've stumbled upon this one sooner...

location: projects > TreeFox
created: 12/12/2007 23:25:24 « modified: 12/12/2007 23:25:24 weight: 0
tokens: delphi