Poslední příspěvky

Stran: [1] 2 3 ... 10
1
Obecné / Re:MVVM+DSharp+Spring4D DI+Marhmallow
« Poslední příspěvek od Delfin kdy Dnes v 22:00:55 »
Otazka je strasne dlouha (opticky) ::) Nehledas metody instance TSession? Viz. napr.

..\Marshmallow\Demos\GettingStarted\Views\ViewMain.pas
2
Obecné / MVVM+DSharp+Spring4D DI+Marhmallow
« Poslední příspěvek od egroups kdy Dnes v 18:44:11 »
Poprosím o radu zdejší machry.Snažím se ve zděděné "legacy" aplikaci zavést poněkud pořádek a hlavně ji zmodernizovat.
Snažím se teď pochopit,jak nejlépe implementovat Model-View-ViewModel.
Ve Spring,respektive Marshmallow mám nadefinované entity z DB.K tomu samozřejmě repozitáře,takže strana Modelu je mi v podstatě jasná.ViewModel by se měl starat přes Repository o konkrétní Entity,čímž jsem se samozřejmě odstínil od konkrétní DB.Všechno co je důležité,by měl zařizovat ViewModel,potud jakžtakž je mi to jasné.
Problém mám s View.
Začal jsem se základním číselníkem,nepodstatným čeho,třeba sazebník DPH.Vytvořil jsem formulář,který obsahuje PageControl s 2 záložkami (List a Detail).
Na první záložce je v podstatě jen grid se seznamem všech entit,které nabinduji pomocí DSharp z ViewModelu,který si v podstatě hrábne přes repository pro konkrétní List všech Entit.
Na druhé záložce mám vlastně jen Edity atd,do kterých nabinduji opět pomocí DSharp hodnoty konkrétní vybrané Entity.
Mám to doplněno o několik tlačítek pod seznamem,typu New/Edit/Delete a o tlačítka Save/Cancel pod detailním náhledem těch editů.
Mám to udělané tak,že při otevření formuláře se zobrazí pouze záložka se seznamem a uživatel má možnost vytvořit nový záznam nebo si rychle najít konkrétní záznam (pomocí filtrů nad gridem) a buď ho zeditovat nebo smazat.Pokud chce vytvořit nový nebo zeditovat,tak samozřejmě zavolám nějakou TAction,ať už přes příslušné tlačítko nebo třeba přes doubleclick na gridu a v tu chvíli se formulář přepne na záložku Detail,čímž skryje záložku List a má přednaplněné kolonky a může editovat.Nakonec buď dá něco jako Cancel a záložka s Detailem se schová a vrátí se zpět na záložku List,přičemž se nic nezměnilo.Nebo dá něco jako Save a přes repository by se měly úpravy uložit do DB a vrátit na List.

A tady jsem právě narazil na kámen úrazu s kterým si nevím rady.Jde o to,že formulář by neměl dělat nic jiného,než příslušně přepínat záložky,předat přes binding do ViewModelu patřičné údaje nebo si je naopak vzít a pak říct ViewModel,aby se postaral o to ukládání,mazání atd.
Ale nevím,jak to udělat,aby View dalo vědět ViewModelu,co po něm chce za činnost.
Snažím se to udělat nějak univerzálně pro všechny číselníky,protože funkčnost bude skoro furt stejná,takže jsem udělal něco jako TCiselnikViewModel a pomocí generic mu říkám o jakou Entitu se jedná a až v konkrétních případech předám View konkrétní konkrétní implementaci z DI kontejneru.
V jednom z velmi mála příkladů,které se mi podařilo na inetu najít používá jeho autor tuto konstrukci:
Kód: [Vybrat]
[Inject(ViewModel_Ciselnik_Skupina)]
property ViewModel: TObject read FViewModel write SetViewModel;
View získá z kontejneru správnou implementaci ViewModel,která mám schované za něčím takovým:
Kód: [Vybrat]
ICiselnikViewModel = interface(IBaseViewModel)
  ['{E04D38A0-1A83-410E-8B9A-951265A7CB64}']
  procedure New;
  procedure Edit;
  procedure Delete;
  procedure Save;
end;

ICiselnikViewModel<TEntity: class, constructor;TID> = interface(ICiselnikViewModel)
   ['{4098570A-18E7-41C5-8FE7-37D001FEA534}']
   function GetEntity: TEntity;
   procedure SetEntity(const value: TEntity);
  procedure Add;
  function GetCanDelete: Boolean;
  function GetCanEdit: Boolean;
  property CanDelete: Boolean read GetCanDelete;
  property CanEdit: Boolean read GetCanEdit;
end;
V tuto chvíli nemám problém s bindováním třeba tohoto:
Kód: [Vybrat]
  bgMain.AddBinding(ViewModel,'Entity.Nazev',edtNazev,'Text',bmTwoWay);
  bgMain.AddBinding(ViewModel,'Entity.Marze',edtMarze,'Text',bmTwoWay);
Ale nevím si naprosto rady,jak ve View v nějaké proceduře/akci zavolat ViewModel.Save.
Kompilátor samozřejmě zakřičí,že TObject nezná metodu Save.
Zkoušel jsem to překopat tak,aby property ViewModel nebyla TObject,ale třeba ICiselnikViewModel,ale v tu chvíli mi zase přestal Container vracet správnou konkrétní implementaci i když byla správnš zaregistrovaná.

Na netu je zoufale malinko příkladů MVVM v Delphi potažmo s DSharp,prakticky skoro žádné,(narozdíl od C#,což je pro mne španělská ves).
Našel jsem vlastně jen 2.
Nicméně něco jsem vyčetl a zkusil využít a dost mi toho už funguje dle mých představ.
Ale tady jsem se hrozně zasekl.

Možná,že na to jdu úplně blbě nebo jen nějakou maličkost dělám blbě.
Budu vděčný,kdyby mě někdo nakopl správným směrem (ne do určitého místa:).Určitě se tu najde někdo,kdo MVVM běžně používá i když možná ne s DSharp,ale to není až tak podstatné,princip bindingu budu skoro furt stejný a třeba by se podělil o pár kousků svého kódu pro inspiraci nebo aspoň naznačil,jak na to,případně doplnil,čeho se vyvarovat.

Předem moc díky.
3
Obecné / Re:xmldokument problem
« Poslední příspěvek od Ján Masaryk kdy Dnes v 17:33:06 »
Keď počujem XML, tak sa mi zježia všetky chlpy na tele :)

Skús superobject viď príloha, alebo si to stiahni z https://github.com/hgourvest/superobject

Primárne je to na prácu s JSON, ale dokáže to parsovať XML.
Skúsil som to a keď som videl výsledok, skoro som sa rozplakal od zlosti, ako komplikovane som robil parsery.

Malá ukážka kódu

Kód: [Vybrat]

// NACITANIE SUBORU
cXML := XMLParseFile('161112202.xml', true);

// PRECITANIE POPISU 18. POLOZKY SUBORU
cPopis := cXML.S['zbozi[18].popis'];


Doporučujem minimálne vyskúšať.



4
Obecné / Re:xmldokument problem
« Poslední příspěvek od František kdy Dnes v 15:57:39 »
dík za všetkých

aj za bonbónik
Kód: [Vybrat]
{!}{???}
5
Obecné / Re:docwiki.embarcadero.com zrejme nejde od 18.11.2017
« Poslední příspěvek od mibainfo kdy Dnes v 15:10:54 »
Docwiki už  ide. Trvalo to od 17. 11. 2017
Takže cca 5 dní.. Hlavne, že konečne ožila:)
6
Delfin, ak zvážiš, že
1. vstupy sa môžu preberať aj z excelu. Od x rôznych zdrojov, na ktorých autorov nie je dosah a
2. Výstupy z db enginy spravidla (cca 17-20 rokov), smerujem do Excelu (vrátane orámovania tabuliek, podfarbených buniek, fontov.. Je to teda finalizovaný výstup. Prípadne doplnený grafmi.
Potom možnosť kvalitného popisu stĺpcov a hárkov, prestáva byť až tak divný..
3. Ešte k Access engine - má zaujímavé a nie moc známe finty:
a/ SELECT * FROM [Excel 12.0;Database=FullXlsName].[$SheetName]
b/ SELECT * INTO [Excel 12.0;Database=FullXlsName].[NewSheetName] from myTable
Takže v tom prípade ak nechcem premenovávať stovky polí, čo iného mám na výber, než akceptovať tie, čo v ms excel už niekto vytvoril..
Ak mám externé dáta v databáze, tam si ich už môžem vhodne premenovať. To je to najmenej.
Access engina už roky dovolí čarovať z názvami polí v zmysle tohoto obrázku:



Radost pohledet ;D Urcite bych nezapomnel pridat "zero width space" kde se da :)
Je zrejme chápané, že si sťažujem prácu. Ale ja v tomto robím už roky. Nevyplatilo by sa mi prácu si sťažovať zbytočne. Len sa to zrejme ťažšie vysvetľuje.
7
Obecné / Re:xmldokument problem
« Poslední příspěvek od pf1957 kdy Dnes v 13:55:10 »
Ten tvoj parser možno na ukážku ako výučbový materiál by to stálo za to.

Kód: Delphi [Vybrat]
  1. //------------------------------------------------------------------------------
  2.                                   TYPE
  3. //------------------------------------------------------------------------------
  4.   eMarkupLanguageToken  = (etokNone,etokTagOpen,etokTagClose,etokTagSolitair,
  5.                            etokTagProc,etokTagDecl,etokTagInclude,etokTagComment,etokTagScript,
  6.                            etokTagCDATA,etokText,etokUnicodeBOM);
  7.   tMarkupLanguageToken  = set of eMarkupLanguageToken;
  8.  
  9.  
  10.   TOnTagEvent     = procedure (Sender:TObject; ATag: ANSIString; AAttributes:TStrings) of Object;
  11.   TOnTextEvent    = procedure (Sender:TObject; const AText:ANSIString) of Object;
  12.   TOnIncludeEvent = procedure (Sender:TObject; const ACommand:ANSIString; AAttributes:TStrings; var ABuffer:PChar; var ABufSize:integer) of object;
  13.  
  14.  
  15.   TMarkupLanguageParser = class
  16.   strict protected
  17.     FOnTag:            TOnTagEvent;
  18.     FOnText:           TOnTextEvent;
  19.     FOnInclude:        TOnTextEvent;
  20.     FAttributes:       TStringList;
  21.   strict protected
  22.     procedure          _ReportTag    (const ABuffer; var ALTPos,AGTPos:integer);
  23.     procedure          _ReportText   (const ABuffer; var ALTPos,AGTPos:integer);
  24.     procedure          _AppendText   (const ABuffer; var ALTPos,AGTPos:integer);
  25.     procedure          _ReportInclude(const ABuffer; var ALTPos,AGTPos:integer);
  26.   public
  27.     function           Preprocess(const ABuffer; ASize:integer): boolean; overload;
  28.     function           Preprocess(const HTML:ANSIString):        boolean; overload;
  29.     function           Preprocess(HTML:TStream):                 boolean; overload;
  30.     function           Parse     (const ABuffer; ASize:integer): boolean; overload;
  31.     function           Parse     (const HTML:ANSIString):        boolean; overload;
  32.     function           Parse     (HTML:TStream):                 boolean; overload;
  33.     constructor        Create;
  34.     destructor         Destroy; override;
  35.   //published
  36.   public
  37.     property OnInclude: TOnTextEvent read FOnInclude write FOnInclude;
  38.     property OnTag:     TOnTagEvent  read FOnTag     write FOnTag;
  39.     property OnText:    TOnTextEvent read FOnText    write FOnText;
  40.   end;
  41.  
  42. //==============================================================================
  43. //
  44. //{O} TMarkupLanguageParser
  45. //
  46. //==============================================================================
  47.  
  48.  
  49.   //------------+---------------------------------------------------------------
  50.     constructor TMarkupLanguageParser.Create;
  51.   //------------+---------------------------------------------------------------
  52.     begin
  53.       inherited Create;
  54.       FAttributes := TStringList.Create;
  55.     end;
  56.  
  57.   //------------+---------------------------------------------------------------
  58.     destructor  TMarkupLanguageParser.Destroy;
  59.   //------------+---------------------------------------------------------------
  60.     begin
  61.       FAttributes.Free;
  62.       inherited Destroy;
  63.     end;
  64.  
  65.     function HandleWhiteSpaces(ACh:Char; var ASpace:boolean): ANSIString;
  66.     const
  67.       cWhiteSpaceChars: set of char = [#1..' '];
  68.     begin
  69.       if (ACh in cWhiteSpaceChars) then
  70.         begin
  71.           if ASpace then
  72.             Result := sz
  73.           else
  74.             begin
  75.               Result := ' ';
  76.               ASpace := TRUE;
  77.             end;
  78.         end
  79.       else
  80.         begin
  81.           Result := ACh;
  82.           ASpace := FALSE;
  83.         end;
  84.     end;
  85.  
  86.     function UnquoteString(const S:ANSIString): ANSIString;
  87.     var
  88.       i: integer;
  89.     begin
  90.       Result := sz;
  91.       for i:=1 to Length(S) do
  92.         begin
  93.           if (S[i]<>'"') and (S[i]<>'''') then  {!}{???}
  94.             Result := Result+S[i];
  95.         end;
  96.     end;
  97.  
  98.     function CopyTagName(S: ANSIString): ANSIString;
  99.     var
  100.       x: integer;
  101.     begin
  102.       x := Pos(' ',S);
  103.       if x=0 then
  104.         x := Pos('>',S);
  105.       Result := Copy(S,2,x-2);
  106.     end;
  107.  
  108.     procedure ToLower(var AAttr:ANSIString);
  109.     var
  110.       i: integer;
  111.       S: ANSIString;
  112.     begin
  113.       i := 1;
  114.       while (i<=length(AAttr)) and (AAttr[i]<>'=') do
  115.         inc(i);
  116.       S := ANSILowerCase(copy(AAttr,1,i-1));
  117.       move(S[1],AAttr[1],length(S));
  118.     end;
  119.  
  120.     procedure ParseTagAttributes(ATag: ANSIString; AAttributes:TStrings);
  121.     const
  122.       cDelimiters: set of char = [' ','<','>'];
  123.     var
  124.       i:     integer;
  125.       S:     ANSIString;
  126.       OnStr: Boolean;
  127.     begin
  128.       AAttributes.Clear;
  129.       OnStr := FALSE;
  130.       for i:=1 to Length(ATag) do
  131.         begin
  132.           if ATag[i]='"' then
  133.             OnStr := not OnStr;
  134.           if (ATag[i] in cDelimiters) and (not OnStr) then
  135.             begin
  136.               if length(S)>0 then
  137.                 begin
  138.                   ToLower(S);
  139.                   AAttributes.Add(UnquoteString(S));
  140.                 end;
  141.               S := sz;
  142.             end
  143.           else
  144.             S := S+ATag[i];
  145.         end;
  146.     end;
  147.  
  148.   //------------+---------------------------------------------------------------
  149.     procedure   TMarkupLanguageParser._ReportTag
  150.                 (const ABuffer; var ALTPos,AGTPos:integer);
  151.   //------------+---------------------------------------------------------------
  152.     var
  153.       Lng:   integer;
  154.       PC:    pChar;
  155.       Token: ANSIString;
  156.     begin
  157.       Lng := AGTPos-ALTPos;
  158.       if Lng>0 then
  159.         begin
  160.           PC := pChar(integer(addr(ABuffer))+ALTPos);
  161.           SetLength(Token,Lng);
  162.           system.move(PC^,Token[1],Lng);
  163.           if Assigned(FOnTag) then
  164.             FOnTag(Self,Token,nil);
  165.         end;
  166.       ALTPos := AGTPos;
  167.     end;
  168.  
  169.   //------------+---------------------------------------------------------------
  170.     procedure   TMarkupLanguageParser._ReportText
  171.                 (const ABuffer; var ALTPos,AGTPos:integer);
  172.   //------------+---------------------------------------------------------------
  173.     var
  174.       Lng:   integer;
  175.       PC:    pChar;
  176.       Token: ANSIString;
  177.     begin
  178.       Lng := ALTPos-AGTPos;
  179.       if Lng>0 then
  180.         begin
  181.           PC := pChar(integer(addr(ABuffer))+AGTPos);
  182.           SetLength(Token,Lng);
  183.           system.move(PC^,Token[1],Lng);
  184.           Token := astrrbo(astrreplcc(Token));
  185.           if Assigned(FOnText) and (Token<>sz) then
  186.             FOnText(Self,Token);
  187.         end;
  188.     end;
  189.  
  190.   //------------+---------------------------------------------------------------
  191.     procedure   TMarkupLanguageParser._AppendText
  192.                 (const ABuffer; var ALTPos,AGTPos:integer);
  193.   //------------+---------------------------------------------------------------
  194.     var
  195.       Lng:   integer;
  196.       PC:    pChar;
  197.       Token: ANSIString;
  198.     begin
  199.       Lng := ALTPos-AGTPos;
  200.       if Lng>0 then
  201.         begin
  202.           PC := pChar(integer(addr(ABuffer))+AGTPos);
  203.           SetLength(Token,Lng);
  204.           system.move(PC^,Token[1],Lng);
  205.           Token := astrrbo(astrreplcc(Token));
  206.           if Assigned(FOnText) and (Token<>sz) then
  207.             FOnText(Self,Token);
  208.         end;
  209.     end;
  210.  
  211.   //------------+---------------------------------------------------------------
  212.     procedure   TMarkupLanguageParser._ReportInclude
  213.                 (const ABuffer; var ALTPos,AGTPos:integer);
  214.   //------------+---------------------------------------------------------------
  215.     var
  216.       Lng:   integer;
  217.       PC:    pChar;
  218.       Token: ANSIString;
  219.     begin
  220.       Lng := AGTPos-ALTPos;
  221.       if Lng>0 then
  222.         begin
  223.           PC := pChar(integer(addr(ABuffer))+ALTPos);
  224.           SetLength(Token,Lng);
  225.           system.move(PC^,Token[1],Lng);
  226.           if Assigned(FOnInclude) then
  227.             FOnInclude(Self,Token);
  228.         end;
  229.       ALTPos := AGTPos;
  230.     end;
  231.  
  232.   //------------+---------------------------------------------------------------
  233.     function    TMarkupLanguageParser.Preprocess
  234.                 (const ABuffer; ASize:integer): boolean;
  235.   //------------+---------------------------------------------------------------
  236.     var
  237.       LTPos: integer;
  238.       GTPos: integer;
  239.     begin
  240.       Result  := TRUE;
  241.       if ASize<=0 then
  242.         exit;
  243.       //
  244.       LTPos := 0;
  245.       GTPos := 0;
  246.       repeat
  247.         // Replace <!--# ..... --> comments
  248.         if abufSameSubStr('<!--#',addr(ABuffer),ASize,LTPos) then
  249.           begin
  250.             GTPos := abufFindSubStrEnd('-->',addr(ABuffer),ASize,LTPos+5);
  251.             if GTPos<0 then
  252.               exit;
  253.             _ReportInclude(ABuffer,LTPos,GTPos);
  254.           end
  255.         // Copy text between comments
  256.         else
  257.           begin
  258.             LTPos := aBufFindSubStr('<!--#',addr(ABuffer),ASize,GTPos+1);
  259.             if LTPos<0 then
  260.               begin
  261.                 LTPos := ASize;
  262.                 _AppendText(ABuffer,LTPos,GTPos);
  263.                 exit;
  264.               end;
  265.             _AppendText(ABuffer,LTPos,GTPos);
  266.           end;
  267.       until FALSE;
  268.     end;
  269.  
  270.   //------------+---------------------------------------------------------------
  271.     function    TMarkupLanguageParser.Preprocess
  272.                 (const HTML:ANSIString): boolean;
  273.   //------------+---------------------------------------------------------------
  274.     begin
  275.       Result := FALSE;
  276.       if HTML<>sz then
  277.         Result := Preprocess(HTML[1],length(HTML));
  278.     end;
  279.  
  280.   //------------+---------------------------------------------------------------
  281.     function    TMarkupLanguageParser.Preprocess
  282.                 (HTML:TStream): boolean;
  283.   //------------+---------------------------------------------------------------
  284.     var
  285.       Buf: ANSIString;
  286.     begin
  287.       Result := FALSE;
  288.       if HTML.Size<=0 then
  289.         exit;
  290.       Setlength(Buf,HTML.Size);
  291.       HTML.ReadBuffer(Buf[1],length(Buf));
  292.       Result := Preprocess(Buf[1],length(Buf));
  293.     end;
  294.  
  295.  
  296.   //------------+---------------------------------------------------------------
  297.     function    TMarkupLanguageParser.Parse
  298.                 (const ABuffer; ASize:integer): boolean;
  299.   //------------+---------------------------------------------------------------
  300.     var
  301.       LTPos:   integer;
  302.       GTPos:   integer;
  303.       Pos1:    integer;
  304.       Pos2:    integer;
  305.       PC:      pChar;
  306.     begin
  307.       Result := FALSE;
  308.       if ASize<=0 then
  309.         exit;
  310.       LTPos := 0;
  311.       GTPos := 0;
  312.       repeat
  313.         PC := PChar(integer(addr(ABuffer))+LTPos);
  314.         if PC^='<' then
  315.           begin
  316.             inc(PC);
  317.             // XML root
  318.             if abufSameSubStr('<?',addr(ABuffer),ASize,LTPos) then
  319.               GTPos := abufFindSubStrEnd('?>',addr(ABuffer),ASize,LTPos+2)
  320.             // Script
  321.             else if abufSameSubStr('<%',addr(ABuffer),ASize,LTPos) then
  322.               GTPos := abufFindSubStrEnd('%>',addr(ABuffer),ASize,LTPos+2)
  323.             // Comment
  324.             else if PC^='!' then
  325.               begin
  326.                 if abufSameSubStr('<!--',addr(ABuffer),ASize,LTPos) then
  327.                   GTPos := abufFindSubStrEnd('-->',addr(ABuffer),ASize,LTPos+4)
  328.                 else if abufSameSubStr('<![',addr(ABuffer),ASize,LTPos) then
  329.                   GTPos := abufFindSubStrEnd(']]>',addr(ABuffer),ASize,LTPos+2)
  330.                 else if abufSameSubStr('<!DOCTYPE',addr(ABuffer),ASize,LTPos) then
  331.                   begin
  332.                     Pos1  := abufFindSubStrSkipQuoted   ('[',addr(ABuffer),ASize,LTPos+9);
  333.                     Pos2  := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  334.                     if (Pos1>=0) and (Pos1<Pos2) then
  335.                       GTPos := abufFindSubStrEnd(']>',addr(ABuffer),ASize,Pos1+1)
  336.                     else
  337.                       GTPos := Pos2;
  338.                   end
  339.                 else
  340.                   GTPos := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  341.               end
  342.             // Search for ">"
  343.             else
  344.               GTPos := abufFindSubStrEndSkipQuoted('>',addr(ABuffer),ASize,LTPos+1);
  345.             //GT not found
  346.             if GTPos<0 then
  347.               exit;
  348.             _ReportTag(ABuffer,LTpos,GTPos);
  349.           end
  350.         else
  351.           begin
  352. {!}{IBA}(*
  353.             //search "<"
  354.             if SameText(LastTagName,'script') then
  355.               begin
  356.                 LTPos := abufFindSubStr('</script',addr(ABuffer),ASize,GTPos+1);
  357.                 //</script> not found
  358.                 if LTPos<0 then
  359.                   exit;
  360.               end
  361.             else if SameText(LastTagName,'style') then
  362.               begin
  363.                 LTPos := abufFindSubStr('</style',addr(ABuffer),ASize,GTPos+1);
  364.                 //</style> not found
  365.                 if LTPos<0 then
  366.                   exit;
  367.               end
  368.             else
  369. *)
  370.               begin
  371.                 LTPos := aBufFindSubStr('<',addr(ABuffer),ASize,GTPos+1);
  372.                 // "<" not Found
  373.                 if LTPos<0 then
  374.                   begin
  375.                     LTPos := ASize;
  376.                     _ReportText(ABuffer,LTPos,GTPos);
  377.                     exit;
  378.                   end;
  379.               end;
  380.             _ReportText(ABuffer,LTPos,GTPos);
  381.           end;
  382.       until FALSE;
  383.     end;
  384.  
  385.   //------------+---------------------------------------------------------------
  386.     function    TMarkupLanguageParser.Parse
  387.                 (const HTML:ANSIString): boolean;
  388.   //------------+---------------------------------------------------------------
  389.     begin
  390.       Result := FALSE;
  391.       if HTML<>sz then
  392.         Result := Parse(HTML[1],length(HTML));
  393.     end;
  394.  
  395.   //------------+---------------------------------------------------------------
  396.     function    TMarkupLanguageParser.Parse
  397.                 (HTML:TStream): boolean;
  398.   //------------+---------------------------------------------------------------
  399.     var
  400.       Buf: ANSIString;
  401.     begin
  402.       Result := FALSE;
  403.       if HTML.Size<=0 then
  404.         exit;
  405.       Setlength(Buf,HTML.Size);
  406.       HTML.ReadBuffer(Buf[1],length(Buf));
  407.       Result := Parse(Buf[1],length(Buf));
  408.     end;
  409.  
  410.  
8
Access engina už roky dovolí čarovať z názvami polí v zmysle tohoto obrázku:



Radost pohledet ;D Urcite bych nezapomnel pridat "zero width space" kde se da :)
9
Access engina už roky dovolí čarovať z názvami polí v zmysle tohoto obrázku:
Dneska skoro kazdy unikodifikovany RDMBS by mel umoznit zapsat jako identifikator kde co, jen se to musi podle SQL standardu uzavirat do uvozovek, u MS mezi [ ... ], u MySQL mezi ` ... ` a mozna nejaci creativci vymysleli nejakou dalsi pic*vinu... SQLite podporuje tusim vsechny syntaxe (ale uz jsem s tim roky nic nedelal)
10
Obecné / Re:xmldokument problem
« Poslední příspěvek od pf1957 kdy Dnes v 13:40:32 »
Ten tvoj parser možno na ukážku ako výučbový materiál by to stálo za to.
našiel som aj toto http://delphi.cz/post/OXml-The-next-generation-XML-library-for-Pascal.aspx
Ja to tenkrat musel rychle vyprasit, protoze nic nebylo resp. to co bylo chtelo validni dokumenty... Kdyz si prectes diskusi pod tim parserem od Oxo, tak tam maji nejaky SimpleXML a buhvi co jeste. Takze dneska nejspis nema cenu se zabyvat vlastnim parserem, pokud nechces konkukrovat Oxovi :-)
Stran: [1] 2 3 ... 10