• Nieuwe artikelen

  • Smartmobile bevindingen

    Op verschillende seminars zie ik leuke dingen van Smart Mobile uitkomen. Inmiddels is versie 2.1 gereleased en verwacht je een leuk product. Gisteren een demo-key aangevraagd voor professional. De enterprise heb ik niet nodig, omdat ik geen datasnap heb en daarvan de prijs nog veel te hoog vind voor een hobby gebruiker.
    Mijn doel is uiteindelijk een webpagina te maken, die gegevens uit een database haalt (via REST) en deze presenteert op het scherm. Uiteindelijk zal het een webpagina zijn, waarvan ik een naam kan selecteren en een frame kan tonen in de browser. Zo kan elke gebruiker zelf een keuze maken wat hij/zij wilt zien (www.caviawatch.nl). Maar eerst een product leren gebruiken. Anders kom je niet ver.
    Welk ontwikkeldialect gebruikt Smart Mobile? PASCAL! Dat is mooi. Ik werk al jaren met Delphi / Lazarus en kan dus wel wat programmeren om een redelijk programma te kunnen tonen. De installatie is simpel. Downloaden van de website, installeren en de demo-key invoeren. Deze key is 35 dagen geldig. Als je niets te doen hebt, heb je zat tijd om alles uit te vogelen. Programma opgestart en het eerste wat je ziet is de IDE. Deze is een beetje opgebouwd op basis van D7, maar ondanks alles neergezet als een single doc, waardoor het een look'n'feel krijgt van D2005+.

    Als eerste ga je kijken naar de demo's. Dat zijn er best wel veel, maar 95% is gerelateerd op client niveau. Ik wil juist op client/server werken, zodat ik resultaat van tabel vanuit mijn databaseserver krijgt in mijn browser. Daar zijn geen demo's van. Een enkele, die een tabel vult vanuit een button, maar ik kan niet zien waar die gegevens staan. Ik zie in de debuggerscherm dat er wel records worden aangemaakt, maar waar geplaatst worden en ik geen idee van.
    Maar het best leren doe je door eigen programma's te maken met behulp van de documentatie.
    Een nieuw visual project opgestart. De IDE komt met een leegscherm wat tevens je formulier is. Geen border, want het is geen echt venster, maar een pagina in je browser. Een beetje gekeken naar welke componenten aanwezig zijn en viel mij een beetje tegen. De standaard (common) componenten zijn een beetje hetzelfde als in Delphi/Lazarus. Ik begrijp alleen niet waarom er een aparte tabblad is voor mobile componenten. De datatab valt een beetje tegen. Daar staat alleen een grid en een chart in. Eigenlijk had ik ook componenten verwacht, zoals TDatabase en TDataset en DBComponenten, die visueel een SQLite database direct kan benaderen. Is een visual IDE niet gemaakt, om de ontwikkelaar het laten vereenvoudigen om met simpele handelingen uit te kunnen voeren. Ik weet dat je een database als MySQL/MariaDB, SQLServer, Firebird/Interbase of Oracle zomaar kan benaderen, omdat deze achter een firewall zitten, maar SQLite is eigenlijk een local database. Maar wie weet.

    Mijn eerste doelstelling: het tonen van een grid met data erin. Component W3Grid gepakt en deze op het formulier geplaatst. Dan zal je verwachten dat je, net zoals een TStringgrid, al een basis grid hebt. Maar het component is leeg. Sterker nog; je MOET zelf de bronbestand van de grid in de uses plaatsen. Vervolgens moet je het zelf declareren in de {private} sector van je formulier. Waarom doet de IDE dat niet voor je! Je moet de Grid zelf in runtime aanmaken. Ziet er dan zo uit:
    Delphi Code:
    1. procedure TForm1.InitializeForm;
    2. begin
    3.   inherited;
    4.   // this is a good place to initialize components
    5.   MyGrid := TW3Grid.Create(Self);
    6.   MyGrid.Visible := True;
    7.   Mygrid.Top := 20;
    8.   Mygrid.Left := 20;
    9.   MyGrid.HeaderHeight := 26;
    10.   MyGrid.RowHeight := 24;
    11. end;
    Dan heb je een Grid gedefineerd zonder kolommen. Deze moet je ook zelf aanmaken. De handleiding vertelt dat je W3Columns in je 'uses' moet plaatsen. Echter is de handleiding nog geschreven voor versie 1 en is deze reeds ondergebracht in smartCL.grid.columns. Om uiteindelijk 1 regel met data te tonen, is dit geprogrameerd:
    Delphi Code:
    1. procedure TForm1.InitializeForm;
    2. var MyTextColumn: TW3TextColumn;
    3. begin
    4.   inherited;
    5.   // this is a good place to initialize components
    6.   FHttp := TW3HttpRequest.Create;
    7.   FHttp.OnDataReady        := HandleHttpDataReady;
    8.   FHttp.OnReadyStateChange := HandleHttpReadyStateChanged;
    9.   MyGrid := TW3Grid.Create(Self);
    10.   MyGrid.Visible := True;
    11.   Mygrid.Top := 20;
    12.   Mygrid.Left := 20;
    13.   MyGrid.HeaderHeight := 26;
    14.   MyGrid.RowHeight := 24;
    15.   MyTextColumn := TW3TextColumn.Create(MyGrid as IW3ColumnsControl);
    16.   MyGrid.Columns.Add(MyTextColumn);
    17.   MyTextColumn := TW3TextColumn.Create(MyGrid as IW3ColumnsControl);
    18.   MyGrid.Columns.Add(MyTextColumn);
    19.   MyGrid.Columns[0].Width := 100;
    20.   MyGrid.Columns[0].Header.Caption := 'nick name';
    21.   MyGrid.Columns[1].Width := 120;
    22.   MyGrid.Columns[1].Header.Caption := 'real name';
    23.   MyGrid.AddRow;
    24.   MyGrid.Cell[0, MyGrid.LastAddedRow].Value := 'jkuiper';
    25.   MyGrid.Cell[1, MyGrid.LastAddedRow].Value := 'john';
    26. end;
    Uiteindelijk zie je in de meegeleverde browser en in je eigen browser een tabel (grid) met 1 regel erin.

    Volgende struikelblok: het ophalen van data via een phpscript op een webserver (REST). In de handleiding staat dat je gebruik moet maken van de class TW3Httprequest. Ook daarvan is geen component beschikbaar en moet dus worden gemaakt in runtime. Voorbeeld in de handleiding gevolgd en kwam op het resultaat dat ik een JSON file te zien kreeg in een memoveld in de browser. Oke. JSON is een standaard formaat voor javascript om met data om te gaan. Omdat ik in mijn chatbox applicatie gebruik maak van XML, moest ik even uitzoeken hoe ik dat met PHP in JSON formaat kon krijgen (PHP 5.2.6). Uiteindelijk is dit het resultaat geworden:
    Delphi Code:
    1. <?PHP
    2. $streamrow = mysql_fetch_array($CamResult, MYSQL_ASSOC))
    3.   {
    4.     $link['nickname'] = $streamnow['nickname'];
    5.     $link['realname'] = $streamnow['realname'];
    6.     array_push($linklist,$link);
    7.   }
    8.   echo json_encode($linklist);  
    9. ?>
    Als ik een request naar mijn phpscript doe, komt de meegeleverde browser van Smart Mobile met deze regel:
    [{"nickname":"jkuiper","realname":"john"},{"nickname":"marcel","realname":"marcel"},{"nickname":"goleztrol","realname":"jos"},{"nickname":"rvk","realname":"rik"},{"nickname":"antoine","realname":"anton"},{"nickname":"benno","realname":"benno"},{"nickname":"ericlang","realname":"eric"},{"nickname":"wok","realname":"peter"}]
    Echter ziet mijn browser (Firefox) dit niet als ik op de button "Open browser" drukt. Maar als ik rechtstreeks de script in de broser uitvoer, dan zie ik wel data. Is mijn JSON niet echt een JSON?
    Je kan in Smart Mobile een JSON request rechtstreeks uitvoeren. Ik krijg het niet voor elkaar. Er wordt gesproken over 'HandleClick(Sender:TObject)', maar die kan ik nergens vinden. Door de code in een Onclick event van een button te plaatsen, werkt het ook niet. Mis ik bepaalde info? Dan maar op de ouderwetse manier. Ik wil die data gewoon kunnen plaaten in mijn eigen DBGrid. Als je al een tijdje in Delphi/Lazarus programmeeert, kan je echt wel een string parsen naar data, die jij wilt zien. StringReplace() bestaat niet. Ik kon de '[' en ']' alleen verwijderen met copy(). Nadat dit te hebben uitgevoerd, laat ik de tekst parsn met een stringlist. Je zou zeggen dat deze bestaat (en volgens het SM forum wordt die ook gebruikt), maar de compiler gaf mij een foutmelding dat deze class helemaal niet bestaat. Vreemd. In Delphi/Lazarus staat deze in classes, maar in Smart Mobile kan ik deze nergens vinden. Ook de documentatie verteld niet waar.
    Ik kan (op dit moment) niet verder. Kan geen JSON parser aan de praat krijgen en kan niet eens zelf parsen.

    Conclusie.
    De IDE ziet er best goed uit. Maar ondanks dat het in pascal taal staat (deze broncode wordt omgezet naar javascript, zodat een browser/smartphone kan begrijpen wat er moet worden getoond), moet je toch enige kennis hebben van deze ontwikkel taal. Een beginner gaat hiet helemaal niets van snappen.
    De documentatie is geschreven voor versie 1. Heel erg lastig als je de voorbeelden wilt volgen met runtime componenten, die in versie 2 in een andere untit zijn gezet.
    Aan deployen ben ik niet meer aan toe gekomen. Had graag een kleine demo voor dit forum willen maken en deze op mijn webserver willen zetten met mijn bevindingen, maar ik heb geen volledig programma.

    Ik ben blij dat ik een werkende demo versie heb. Ik ben benieuwd wat de ervaringen van andere zijn.
    Comments 4 Comments
    1. Benno's Avatar
      Benno -
      John,

      we zijn bezig aan een koppelvlak voor kbmMW waarbij een wizard je ook de client units levert.

      Serverkant zou ik niet in SMS doen, al zijn ze wel bezig op die route met node.js. Voor mijn gevoel is SMS echt een front-end (browser) tool of mobile tool en bouw je de achterkant (server) in iets anders. Koppelen kan heel simpel door een REST API met JSON communicatie.

      Wel leuk dat je er ook mee aan het spelen bent.
    1. jkuiper's Avatar
      jkuiper -
      Benno,

      Ik zou SMS sowieso alleen voor de client site doen. Mijn REST server bestaat uit php scripts, die nu XML leveren, waarvan de data terugkomt als JSON en deze te verwerken in de front-end. Mijn hoop was dat ook een beginner met een klein beetje kennis al aardig uit te voeten kan om een redelijk pagina te maken met communicatie naar een server toe. Nu doe ik dat nog 'met de hand' (zie www.caviawatch.nl). Je moet nog zoveel zelf regelen.
      Ja, dat is ook als je met datasnap/kbmMw/mORMot werkt.

      Mijn gevoel zegt dat er nog veel gedaan moet worden, want nu is het een kunst om het goed aan de praat te krijgen.
      Ik ben benieuwd naar bevindingen van andere gebruikers (zeker onder dit forum).

      Heb jij er al mee gestoeid?
    1. marcov's Avatar
      marcov -
      Ik mis overigens een link naar de meer belangrijkere Pascal gerelateerde Cavia farms, met name Adriaan en Co
    1. mesa57's Avatar
      mesa57 -
      Mijn voorkeur gaat uit naar een tool waarin server en client geïntegreerd zijn. Maar ja, moeilijk te vinden.
  • Nieuwste forumberichten

    Efje

    Veldwaarde binnen een groep ophogen met MYSQL.

    Door het antwoord van Rik ben ik mij in de Pivot gaan verdiepen. Daar kwam ik SQL functies tegen die ik nog niet echt kende zoals Group_concat, Rollup

    Efje Today, 23:30 Go to last post
    Bart B

    Abs(Variant)

    Bedankt voor het testen.
    Waarschijnlijk dus een "implementatie detail" en ongedocumenteerd.

    Bart

    Bart B Today, 18:02 Go to last post
    rvk

    Abs(Variant)

    Er wordt volgens mij ook ergens (op forum of mailinglist) gezegd dat het kan zijn dat het gewoon de eerste "fit" is die de compiler tegen komt.

    rvk Today, 17:59 Go to last post
    Bart B

    Abs(Variant)

    Op de fpc devel list zegt JM op mijn idee dat pas @runtime de juiste overload wordt gekozen:


    Dit zou suggereren dat Delphi altijd

    Bart B Today, 17:39 Go to last post
    rvk

    Abs(Variant)

    Nee, hoor, Abs(-1.5) geeft 1.5. Kijk maar: Showmessage(Abs(-1.5).ToString);


    Ja, maar nu ga je het hebben over een variant. Dat is

    rvk Today, 16:57 Go to last post
    Bart B

    Abs(Variant)

    Hallo,

    Maar weer eens een fpc vs delphi vraagje.
    In fpc geeft Abs(-1.5) als resultaat 2 (en niet 1.5), "hoort" dat zo?

    Bart B Today, 16:35 Go to last post