Jump to content


uniGUI Subscriber
  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by Ron

  1. Sure, we all understand that. I waited about 3-4 years running a small app with Unigui, before I took the chance to migrate a bigger app. But during the years since 2012 I have had only great experiences with Mr. Farshad, and I realize what kind of personality he is. Introvert, hard working, disciplined, organized, systematic, goal-oriented etc etc. Time and again I am taking myself in being highly impressed by the work he has been able to keep up, over these years. I realize this is unusual and that he has done something that no other company with tons of resources has be able to do: taking a very complex technological issue and making it simple. People are different. Some make a mess no matter what they do, while others make it work consistently. I am 100% sure about one thing: Mr. Farshad is not taking this issue lightly. He is not going to take any chances after all this work, as that would totally contradict all previous efforts. The reason some things might take a while to get addressed, is probably due to his diligence, wanting to cover all aspects involved and deliver a great solution. That is what I believe. Surely, in theory anything might happen, and life comes with no guarantees. Just have to live with that.
  2. This you can solve by adding some URL parameters, which you then pick up and use for automatic login. This may include some random code which has a time limit and may only be used once for login, and gets cleared in the db afterwards.
  3. Even though I agree that a plan B is always called for, I have never been scared due to the apparent lack of such in this case. I have never lost a second of sleep over this issue - but maybe I should have. So far it would not have amounted to anything, though, and would only have been a waste of time. Surely, life does not come with a promise of being risk free. But past events predict future behavior, and risk is often related to idiosyncratic issues. Based on this I have the utmost confidence in Mr. Farshads ability to stay in the loop.
  4. I thought about the same, but then wondered if that would create some future limitations. But both could be available, with one overriding the other. E.g. if there is a config file, that overrides servermodule settings.
  5. Agree, it's really not reasonable that it should take 12 hours for a message to be visible on the forum on the other side of the planet, but so it is...Just have to live with it.
  6. It looks at FileVersion, not ProductVersion, and if you set this to "Auto Increment Build Number" at the Version Info setup page, then things will happen pretty automagically. I find this very handy and informative, so I can know that updates has actually been loaded or purged. At development you just Ctrl-F9 to compile and test until happy, and then Shift-F9 to build with an increased build number, and upload.
  7. I have many hyperservers on a single VPS, each in a different folder, and the start ports being set so they do not overlap. Nothing else should be required as far as I know.
  8. You should be able to add an IdHttpServer in the UniServerModule, and process the http requests that way, but on a different port than the server application of course. This demands that the application is loaded, which will not happen until the first mainmodule request is made, as far as I have experienced.
  9. By increasing the form height at click, you will get more space and may expose a panel located at the bottom of the form, if the form is a window not already maximized.
  10. I agree, this is the approach I always use: datasource on the same form as data aware component. I also - in OnCreate on all forms - assign the database to the queries programmatically, as these did get lost. I also open the MainModule - which has the database all other forms link to - before I open other forms, at project load. Doing this, I never get this link issue mentioned above, and it all works perfectly.
  11. It is Delphi which should have had an internal library update routine which downloads the latest build over a secure connection, verifying license data and upgrading at one click...
  12. Ron

    Is possible?

    Sure, Delphi costs a bit, and if the total cost of UniGUI and Delphi is more than you plan to earn in the business, then I see the problem. The real question is how much money are you going to be able to generate using these tools? How fast can you pay them back? If you can generate $50.000 a year then you won't notice the costs. But if you can only generate $2.000 it will be tough.
  13. Ron

    Is possible?

    Regarding documentation, I think it is pretty good. There is the manual and also a lot of good examples. These could have been documented, and that will come no doubt, but most are not complicated at all. The support is great and critical issues are always fixed quickly, and this has happened consistently over many years, so there is no doubt as to the commitment of FMSoft to this project. But the best thing of it all is that UniGUI is so easy to use when you just get a little into it. The learning curve is not steep in my view, but of course it may take a little time to get used to thinking client-server model if webapp building is a new thing.
  14. Ron

    Is possible?

    UniGUI is so reasonably priced that there should be no need to ponder this, if you have one or two customers with projects ready to be made. You are getting the best web application tool in the world right now, and if you are not able to earn that little money it costs, during a few months, then I am sorry to say - with all respect - that you have nothing to do in this business. Think about it: you are getting the best, most productive tool there is, and if you are not able to make money then, quickly enough to pay it back, whose fault is it? Is it the tool? Or is it the user? Or the business model? With UniGUI you can finish projects so fast compared to other tools, and it is so reasonably priced, that there is no real competition - that is the case. Of course, you can go the long route and ponder and test and try all kinds of things, as I did. It takes years. Or you can do things fast - with UniGUI. It's all up to you I am lazy. I want to earn the maximum of money using the minimum of time. That is why I use UniGUI. But - if you want to go the other way and earn just a little money using the maximum of time, then UniGUI is definitely not for you. Think Microsoft then...
  15. I too noticed that. It could be nice with a dayly routine which deleted purged nodes based on age, like number of days, and backup folders based on max number of folders, both set in the config file,
  16. I would rather have API REST access to the hyperserver, so I can monitor many servers from one user interface, and purge nodes and upload to a single server etc. A restriction of the number of sessions should be set in the config file, ideally, and also changeable through the API. When I have 20 Hyperservers, it would be nice to be able to change port settings through an API, instead of editing 20 text files.
  17. Make an ini-file called setup.ini in the same directory as your app: [Setup] Port=8088 Then add this in your servermodule: procedure TUniServerModule.UniGUIServerModuleCreate(Sender: TObject); var Ini: TIniFile; begin ServerRoot:=extractfilepath(GetModuleName(HInstance)); Ini := TIniFile.Create(ServerRoot+'setup.ini'); try Port := strToIntDef(Ini.ReadString('Setup', 'Port', '8088'), 8088); finally Ini.Free; end; end;
  18. I had to give up long polling, as the indy http client was too unstable due to the apache server being nightly restarted. So I had to use cross-origin scripting through the browser to access a local webserver running in a service, and do all processing in separate small applications, to make this 100% stable. So to push stuff to the local computer is not a problem. But to initiate a process from the local computer is harder as you want to affect the running client session, so I am going to set up another solution. For example, for product scanning, I will make the local scanner which is controlled by the service application and connected to the db post the product into a table at the server, and use a timer to check this table when the appointment window where you add products is opened. Only then the timer runs, and fetches the scanned products. Another way is to use websockets, but to emit it without having a local node server...maybe I can call up Explorer as a COM object and run the socket emit code minimized. Have not tried that.
  19. You can have different channels, like you see I have using the handshake.query parameter, where I use the company name to make sure only those in the same company get it. In addition you can filter out messages according to all kind of criteria before they are shown to the user on the client side.
  20. To any socket.io server, yes, but I do not know of any other implementations of socket.io servers than the node.js one. Have not found any windows binaries. Socket.io is not pure websocket protocol, not at all, but it starts there and downgrades to longpolling if the browser do not support websockets. So it provides for greater compatibility across browser versions. Pure websocket components are available for Delphi, from at least one guy.
  21. The node.js server listens on a port, and when you open up the firewall it is exposed and will be able to take client connections. The form which should show the message, is the form with the uniHtmlFrame running the JS code. You can process the message in the htmlFrame, as a chat box, or you can send it to the server and show it from there, save it etc. Since the socket.io client is written in JS, which runs only in the browser or in node.js, you have to go through one of these. You can push messages locally into the node.js server in different ways, but that would be the way to go, if you cannot send it from one of the clients. In the example above, the client should of course only connect to localhost when testing, and be pointed to the actual IP or domain of the live server when in production.
  22. There is no websocket component in Unigui yet, but you may be able to use socket.io with node.js: const socketToken = 'mySpecialToken'; procedure TMainForm.myHtmlFrameAjaxEvent(Sender: TComponent; EventName: string; Params: TUniStrings); begin if eventname='doSocketAuth' then begin UniSession.AddJS('socket.emit("authenticate", {token: "' + socketToken + '"});'); end; if eventname='gotData' then begin //myData:=strtointdef(Params.Values['mydata'], 0); //do something with it end; end; //to broadcast some data procedure TMainForm.socketPush(myData:integer); begin UniSession.AddJS('if(socket !== undefined)socket.emit("'+companyName+'", ' + inttostr(myData) + ');'); end; //some JS to run somewhere to setup the socket connection and catch the incoming data if(socket === undefined){ var socket = io('' + companyName, { reconnection: true, reconnectionDelay: 3000, reconnectionAttempts: 20, forceNew: false, secure: true }); } socket.on('connect', function(){ ajaxRequest(MainForm.myHtmlFrame, ["doSocketAuth"], { }); }); socket.on(companyName, function(data){ ajaxRequest(MainForm.myHtmlFrame, ["gotData"], { mydata : data }); }); //node.js script to run an https socket io server var fs = require('fs'); var https = require('https'); var app = require('express')(); var options = { key: fs.readFileSync('c:/my.key'), cert: fs.readFileSync('c:/my.crt') }; var serverPort = 3000; var server = https.createServer(options, app); var io = require('socket.io')(server); io.on('connection', function(socket){ companyName=socket.handshake.query.company; socket.auth = false; socket.on('authenticate', function(data){ if(data.token == 'mySpecialToken'){ socket.auth = true; } }); setTimeout(function(){ if (!socket.auth) { socket.disconnect('unauthorized'); } }, 1000); socket.on(companyName, function(msg){ if (socket.auth)io.emit(companyName, msg); }); }); server.listen(serverPort, function(){ console.log('Socket.io https server listening on port ' + serverPort); }); You will also need to add socket.io.js to the CustomFiles in servermodule and of course set up the node server.
  23. See attached project, basically you can split the html and the JS. procedure TMainForm.UniFormShow(Sender: TObject); begin HTMLFrame2.HTML.Text:='<div id="fb-root"></div>'+ '<div class="fb-page" data-href="https://www.facebook.com/sbkattila" data-tabs="timeline" data-width="300" data-height="500" data-small-header="true" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="false">'+ '<blockquote cite="https://www.facebook.com/sbkattila" class="fb-xfbml-parse-ignore">'+ ' <a href="https://www.facebook.com/sbkattila">SBK Attila</a>'+ '</blockquote>'+ '</div>'; UniSession.AddJS('(function(d, s, id) { ' + 'var js, fjs = d.getElementsByTagName(s)[0]; ' + 'if (d.getElementById(id)) return; ' + 'js = d.createElement(s); js.id = id; ' + 'js.src = "https://connect.facebook.net/sv_SE/sdk.js#xfbml=1&version=v3.1&appId=1802520233141884&autoLogAppEvents=1"; ' + 'fjs.parentNode.insertBefore(js, fjs); ' + '} ' + '(document, "script", "facebook-jssdk"));'); end; Project1.zip
  24. Maybe you can trigger an AjaxEvent and send the result that way, to the server, and then act on it.
  25. Developing Unigui has no doubt been a monumental task, and considering that this has been done primarily by a single individual - with a lot of support and encouragement along the way of course - and followed up consistently through all the various challenges, is highly impressive. It has no doubt taken an extreme amount of dedication and discipline, and I am just happy that such people exist, to be honest. I would probably pay 10 times as much for Unigui subscriptions, if I had to. I know it might sound a bit far-fetched, but I don't have words to describe how much I appreciate it. Farshad has proven himself to be such a helpful character, that he will always be part of my prayers. And from what I understand, he has a lot of loyal supporters in here As a rule, I never praise people like this, but a couple of times in my life I can handle an Exception, knowing that all good gifts come from above, from a higher power
  • Create New...