Náhodné výkřiky 22

vložil Radek Červinka 1. února 2012 23:10

Dnes to bude o Delphi 1, nějaký Open Source pro syntézu řeči, kousek kódu z RTL, device drivers a Delphi nebo FPC, TMethod, GDI+ a vyhlazování a seminář bude nakonec v Olomouci atd.

Delphi 1 a lokalizace

Jelikož se blíží svátek Valentýna, neboli výročí uvedení Delphi 1 na trh - letos to bude už 17 let - je třeba vytáhnout něco historického:

Na EDN je Delphi Product Definition 3rd Draft - May 13, 1993 (tj. 2 roky před release) a tam mne zaujalo toto:

Delphi 1 localization

Původně se tedy předpokládalo, že Delphi 1 bude i v našem jazyku. Což je pro mne překvapení. Vím, že existoval překlad helpu k BP7, ale myslel jsem si, že je to neofiko a uvedená tabulka mne překvapila (a potěšila). Ale asi se to nakonec nestalo. Nebo jo?

eSpeak

eSpeak je Open Source "text to speech" SAPI5 engine, které funguje i pro češtinu. Sice to zní jako když mluví Číslo 5, ale je to zadarmo. Upozornil mne na to jeden klient, kterému pomáhám a který se specializuje na pomůcky pro zrakově postižené. Kromě toho i existují samozřejmě i kvalitní syntézy, ale někdy tohle stačí.

Na stránce slibují i DLL knihovnu, ale tu jsem tam nenašel, jen SAPI5 verzi. Ale zato je pro více OS.

Pěkné je, že celkem má cca 2M.

TStream.Seek a XE2

Minule jsem tu rozebíral jak jsem ladil TinyDB a kde byl zakopaný pes (v přidané metodě Seek pro 64bit posun).

Jelikož Delphi je velmi o kompatibilitě, bylo nutno zařídit, aby případná 32bit verze Seek za určitých podmínek volala novou 64bit verzi a naopak. Přiznám se, že mne řešení překvapilo (a je to trochu hack). Zároveň pěkně ukazuje použití záznamu TMethod.

function TStream.Seek(Offset: Longint; Origin: Word): Longint;

  procedure RaiseException;
  begin
    raise EStreamError.CreateResFmt(@sSeekNotImplemented, [Classname]);
  end;

type
  TSeek64 = function (const Offset: Int64; Origin: TSeekOrigin): Int64 of object;
var
  Impl: TSeek64;
  Base: TSeek64;
  ClassTStream: TClass;
begin
{ Deflect 32 seek requests to the 64 bit seek, if 64 bit is implemented.
  No existing TStream classes should call this method, since it was originally
  abstract.  Descendent classes MUST implement at least one of either
  the 32 bit or the 64 bit version, and must not call the inherited
  default implementation. }
  Impl := Seek;
  ClassTStream := Self.ClassType;
  while (ClassTStream <> nil) and (ClassTStream <> TStream) do
    ClassTStream := ClassTStream.ClassParent;
  if ClassTStream = nil then RaiseException;
  Base := TStream(@ClassTStream).Seek;
  if TMethod(Impl).Code = TMethod(Base).Code then
    RaiseException;
  Result := Seek(Int64(Offset), TSeekOrigin(Origin));
end;

TMethod podruhé

No a když jsem to nakousl, tak TMethod se ve spolupráci s metodou MethodAddress dá použít pro vyvolání metody dle jména.

program Project2;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Classes;

type
  TDummy = class
  published
    procedure Print;  virtual;
  end;
procedure TDummy.Print;
begin
  writeln('TDummy.Print');
end;

type
  TMyMethod = procedure of object;

var
  oDummy: TDummy;
  proc: TMyMethod;
  method: TMethod;

begin
  oDummy := TDummy.Create;

  method.Data := Pointer(oDummy);
  method.Code := TDummy.MethodAddress('Print');
  proc := TMyMethod(method);

  proc;
  oDummy.Free;
end.

Trochu zvláštní příklad, ale snad to demonstruje dobře. Když jsem si s tím hrál, tak mi to nechtělo fungovat do doby než byla metoda Print published. Což mne trošku překvapuje, protože jsem doufal že by to mohlo fungovat i pro virtuální metody - ale ne. Bez tak je lepší použít unit RTTI z RTL, jak jsem psal dříve.

Device Drivers v Delphi a FPC

Existoval projekt, který dokázal generoval SYS drivery psané v Delphi - Delphi Driver Development Kit (lokal copy). Je to v podstatě hack, kdy za pomocí thirdparty nástroje se upravují obj soubory a výsledný link se provede za pomocí MS Link.

Uvádím to jen protože to ukazuje, že i drivery se v Delphi dají psát. Když budete moc chtít.

Na druhou stranu Free Pascal jako jeden z cílů umožňuje NativeNT target - Target_NativeNT. Díky tomu by mělo jít psát ovladače.

GDI+ a vyhlazování

V diskuzi ohledně vyhlazování ve FireMonkey (resp. v GDI+ verzi) mne inspiroval zajímavý kousek kódu, který demonstruje různé způsoby vyhlazování GDI+.

uses
  Winapi.GDIPOBJ, Winapi.GDIPAPI;

procedure DrawGdiPlus(dc: HDC);
var
  LGraphics : TGPGraphics;
  LFont: TGPFont;
  LPointF: TGPPointF;
  LBrush: TGPSolidBrush;
  LHint: TextRenderingHint;

  procedure Draw(y: Integer; hint:TextRenderingHint; const sName:string);
  begin
    LPointF.Y := y;
    LGraphics.SetTextRenderingHint(hint);
    LGraphics.DrawString(sName, Length(sName), LFont, LPointF, LBrush);
  end;

begin
  LGraphics := TGPGraphics.Create(dc);
  LFont := TGPFont.Create('Arial', 10);
  LPointF.X := 0; LPointF.Y := 0;
  LBrush := TGPSolidBrush.Create(MakeColor(255, 0, 0, 0));

  Draw(20, TextRenderingHintSystemDefault, 'TextRenderingHintSystemDefault');
  Draw(40, TextRenderingHintSingleBitPerPixelGridFit, 'TextRenderingHintSingleBitPerPixelGridFit');
  Draw(60, TextRenderingHintSingleBitPerPixel, 'TextRenderingHintSingleBitPerPixel');
  Draw(80, TextRenderingHintAntiAliasGridFit, 'TextRenderingHintAntiAliasGridFit');
  Draw(100, TextRenderingHintAntiAlias, 'TextRenderingHintAntiAlias');
  Draw(120, TextRenderingHintClearTypeGridFit, 'TextRenderingHintClearTypeGridFit');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    DrawGdiPlus(GetDC(Handle));
end;

Seminář v Olomouci

Embarcadero CZ+SK chystá seminář o RAD Studiu XE2 dne 6.3.2012 a nakonec bude v Olomouci. Přednášet bude Pawel Glowacki. Registrace začne kolem 13.2.2012.

Oftopinka

je pro dnešní den jak udělat hodiny ze starého HDD.


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , , , ,

Komentáře

2.2.2012 10:45:48 #

JaroB

To si tak namátkou vzpomínám, jak jsem v Delphi 1 překládal kód pro DOS, musel jsem vytvořit DPL knihovnu se systémem a nacpat tam CRT a řádkovým překladačem to překládat. Byla to fakt síla, ale fungovalo to!

JaroB

2.2.2012 11:54:21 #

tomk

Ten help k BP7 jsme s kolegou prekladali. Nejdrive jsem nekdy v prosinci 89 "desifrovali" format HLP souboru a napsali kompilator formatovaneho textu do Borlandskeho HLP; ale uz vubec nevim proc ;)

Potom jsem hledali, jak to vyuzit. A nakonec si Apro (tehdejsi distributor BP pro Ceskoslovensko) objednalo preklad. Ceske nazvoslovi doladoval znamy pascalista Jan Sebelik. Takze to bylo neofiko-ofiko.

Pak si Borland chtel ridit preklady sam. Celou historii si bude mozna lepe pamatovat p. Kubat, ktery byl spolecnikem Apra.

tomk

2.2.2012 12:29:29 #

Radek

take mam jedno vyuziti TMehod

Nejdrive najdu tridu...
t := c.FindType(self.controllerUnitName + '.' + self.controllerClassName);
if t = nil then
    raise EControllerNotFound.CreateFmt('Nebyl nalezen controller "%s"!', [self.controllerName]);

Pak v ni metody...
m := t.GetMethod(self.actionMethodName);
    if m = nil then
      raise EActionNotFound.CreateFmt('Akce "%s" není v controlleru "%s" definována!',
        [self.actionName, self.controllerName]);
    method.Code := m.CodeAddress;
    method.Data := Pointer(self.controllerInstance);
    self.fAction := TControllerAction(method);

a zavolam ji...
    self.action();

Mam to pouzito v takovem mensim http serveru a volam tak metody pro osetreni pozadavku na url http://domena.cz/controller/action

Radek

2.2.2012 13:27:39 #

PS

to JaroB: s príchodom 32bit to bolo jednoduhšie, stačil WDOSX extender a preklad pekne v IDE (ako konzolová aplikácia).

PS

2.2.2012 16:22:55 #

Richard Kubát

Doplnění toho, co napsal "tomk":

Už je to děsně dávno, ale je fakt, že společnost Apro vytvořila zdařilé české mutace dBase i Paradoxu. Hlavní práci, myslím, odvedl Martin Hladík, dnešní jednatel a spolumajitel Apra - a udělal to velice pečlivě. České mutace byly povedené, tak u Borlandu počítali, že to bude pokračovat a že všechny české mutace produktů budou stejně dobré.

Jenže pak přišly zlé časy a na lokalizaci nezbyly peníze. Pokud je ten dokument, který Radek našel na EDN, z roku 1993, tak to sedí, protože právě v tomto roce Borland prodal nástroje Quattro Pro a Paradox aby si zachránil kůži v době poklesu zisku pravděpodobně následkem nevalného manažerského řízení firmy jejím prvním ředitelem, panem Philippe Kahnem.

Z lokalizace sešlo a už se pak o ní nehovořilo. Když produkt Delphi 1 přišel v roce 1995 na trh, prodaly se sice závratné počty licencí, které si dnes již neumíme představit (např. po konferenci v hotelu Hilton, kam přišlo 1200 platících posluchačů - nevídané! ... jsme během tří týdnů prodali přes 600 licencí), ale ani to neospravedlnilo investici do české lokalizace. A musím též říci, že řadě programátorů tato myšlenka ani nešla moc pod nos, tak jsme na lokalizaci nikdy příliš netlačili.

Do dnešního dne přežily jen jazykové mutace anglické, francouzské, německé a japonské.

-- Richard Kubát

Richard Kubát

7.2.2012 22:59:36 #

JaroB

Narazil jsem na zajímavý problém při aplikaci stylu, když jsem už použil vlastní obarvování panelu a groupboxu v XE2. Je to asi nějaká chyba ve frameworku, ale blíže jsem to nezkoumal.
Zde http://theroadtodelphi.wordpress.com/2012/02/06/changing-the-color-of-edit-controls-with-vcl-styles-enabled/ je podrobně popsáno jak to lze obejít.

JaroB

8.2.2012 15:47:04 #

RadekV

Ohledne toho psani kernel veci - rozhodne nedoporucuji to zkouset :-) Par veci jsem v kernel modu delal (ted zrovna pracuju na filtrovani sitoveho provozu) a vzhledem k tomu ze dokumentace neni valna ani pro C tak se spoustu veci resi na ruznych forech atd.... Snazit se ziskat podporu pro delphi kod bude asi hodne scifi :-) Ostatne doporucuju se podivat na par samples ve WDKacku aby si clovek udelal obrazek. O tom ze bez precteni Windows Internals nema cenu ani zacinat skoro nema cenu se ani zminovat.

Navic je v kernel modu tolik omezeni (jejichz nedodrzeni ma za nasledek oblibeny BSOD s hlaskou IRQL_NOT_LESS_OR_EQUAL) ze zpusob kterym se programuje je dost odlisny i od prace s winapi jako takovym.
Navic neni nutne (a ostatne ani to neni moc doporucene) pouzivat C++ ale preferovane je pouze C takze ten minimalni rozdil zvladne kazdy programator ktery si zaslouzi toto oznaceni. Zbytek totiz bude clovek resit bez ohledu na jazyk

Mozna pouziti tak mozna pro tzv. nativni NT aplikace coz jsou takove ty ruzne scannery ktere jedou pred tim nez najede windows subsystem ale staci se podivat na sample - z pascalu je tam pomalu jen begin a end :-D


Pripomina me to situaci kdy jsem horko tezko rozjel kompilaci pomoci FPC/ARMu na Nokii 770 (Internet tablet, asi jedine zarizeni nokie bylo produktem mobilni divize a nebyl to mobil) za coz jsem se odmenil pohledem na Hello World bez praktickeho vyuziti :-D

RadekV

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS