Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation on 07/15/20 in all areas

  1. Sherlock

    Are we just "Cash Cows"?

    I didn't read the book, but I'm guessing that only applies when you add those programmers to the same problem. Luckily Delphi has a ton of problems, that could each feed a programmer for at least a month
  2. Attila Kovacs

    Are we just "Cash Cows"?

    they are busy with bumping Delphi 7 licences
  3. Günther Schoch

    Are we just "Cash Cows"?

    Dear Delphi developers, first of all, I do not want to have any "Delphi Development Team" bashing here. I just try to summarize the current big picture and show the dilemma. Not going to much into details, the today status of 10.4 is: 10.4 went clearly into the right direction the development team is highly motivated and shares information the development team is open to arguments and suggestions of the community Why I am not really happy? a lot of issues have to be fixed (which are BETA level but should not be in a final product) fixing takes several n-months using the full resources until then 10.4 cannot be considered fully productive Macro, Bruneau, Dmitry etc, … they all know the problems and work really hard. The performance of the team is great but the output limited I cannot agree with the argument that 10.4 had too many new features. It's more the minimum to survive new basic strategic developments (modern language elements, compiler optimization, etc) not even started The real problem is that the resources are far too small for the real-world challenges of a full development environment. Why is that the case? Are the sales to small? (I would say no) Is the percentage of reinvestment into R&D just too small? (I would say yes) The numbers under https://medium.com/@sammyabdullah/successful-saas-companies-spend-23-of-revenue-on-r-d-3602e9dc2de are rather interesting (marketing driven versus technology driven companies). But what does the Embarcadero management and owners think, given these private equity companies bought Idera/Embarcadero for some crazy amount of money? As long as the sales (software renewals) are still flowing … why should they invest more? This means we come to the cynical conclusion that paying "as long as we pay the software renewals, no additional R&D resources will be hired". But If we do not pay anymore then they just freeze the product?! Ideally there should be a contract form that assures "software renewals go for 50% into R&D". Why? No-more marketing is needed. The renewal is (should be) a fully automatic process without large handling costs. Not easy! regards Günther
  4. David Heffernan

    Are we just "Cash Cows"?

    It's far from that simple. I take it that everybody has read this:
  5. Rollo62

    Are we just "Cash Cows"?

    Yes well. But isn't it more close to that ? https://www.youtube.com/watch?v=JQ8jGqdE2iw
  6. Günther Schoch

    Are we just "Cash Cows"?

    For the mobile area more resources would be essential. We actually never used FMX for production as we considered the delay of supporting platforms as too risky. The VCL side ... well, getting better but still smaller issues. But my main concern is the language itself, the compiler(s) and the testing. IMO for all these aspects additional development resources are essential.
  7. Rollo62

    Are we just "Cash Cows"?

    I see that from two sides. VCL-Side Is quite mature, bugfixes and new features OK, but who REALLY needs that ? No time pressure, low investment is maybe argueable. FMX-Side: Is under high pressure from more and more platforms (including Windows-10). Much more buggy than VCL, less mature, needs a lot of care in the future. Always time pressure, by Android/iOS time schedules, high investment is needed to cover all that. From the VCL-Side I feel quite relaxed, here and there a new language feature will do the job. Nothing is really missing here for my daily work. From the FMX-Side I can spot a massive under-investment. I regularily check the changes and additions to the feature API or mobile platforms. No or very little investment i to new API's and API changes there, only when its absolutely necessay. Why don't we have full API support for the platforms already, or at least 80% ? Why not simply put a task-force to translate all platforms API into Delphi, where mostly this would be routine work for mobile experts ? For example, why is not yet the cool AR/VR added, why did sensor-date had (maybe still have), why is camera still so slow, why not yet full Maps support, why not included full SSL-solution, ... ? Ok, there are solutions like TMSMaps, but why should I use them when Maps already were in the package. Thats what I always also have seen in VCL very sadly, why are many basic components so poorly and minimal designed, not meeting a minimum requirement in real world, just good for demo purposes. I want to use a Delphi FMX-Function, and want forget about the issues and problems behind. Embarcadero should flatten our way, and fix Location, Sensors, Permissions, etc. etc., so that the developers can use and rely on any function. Still there is too much special-knowledge needed, to get a many things running. I'm a lazy developer, want to use API's that do what they promise, don't need to know all details behind. The FMX-Side would be the right place to turn Embarcadero's future, if they could profile themself well as all platforms solution. In marketing yes they do already, but in realiity many of the promises were missing, and I can see not much work on this. A good indicator are also the demos and samples, which were revolutionary at those days, but getting lame and non-functional nowadays. Why is no ony improving, cleanup these features and add new demos permanently, because this is the main entrance for new customers too. I hope everybody understands, that when newbies checking an IDE where 50% of interesting demos don't work, they immediately take a step back and look elsewhere ( at least I do that with new technologies ). If everything works as expected, and without a lot of fumbling around, then the newbies will be catched more easy. These are only a few points where I would like to see a lot more investment. Still I hope for the time factor, so that it might get better in the near future, but for me an IDE which can support platforms out-of-the box should have a good weight in the market. For me mobile, cloud is clearly the future, combining with front- and backend desktop this is a killer feature. There are other nice boys in town, but they all have their pros- and cons as well, and IMHO RadStudio does not so bad in comparison. For the goal to achieve less "investment" gaps, I would like to see a much faster system of updates, patches and hotfixes, to keep us developers up running with high and accelerated pace against all other solutions.
  8. Lars Fosdal

    Are we just "Cash Cows"?

    That reminded me of
  9. Günther Schoch

    Are we just "Cash Cows"?

    We all know that it still takes some time (at least based on all the open serious issues). But my topic was to change something for the future. I am sure that Marco and the team is clever enough to solve a lot more problems and enhance the product if they get more money (very simple calculation). But the money is "used" elsewhere and this should change.
  10. Lars Fosdal

    Parsing JSON response from TVDB

    First, remove the comment at the top of the stdiscovery.json file. Comments are not valid in Json. Save this as Json type unit: StJsonTypes.pas Caveat: I assumed that fields with value NULL are Integer fields. Since we don't have nullables, an Integer NULL becomes, you guessed it: 0. unit StJsonTypes; interface uses System.Classes, System.SysUtils; type TLinks = class(TObject) private Flast: Integer; Fprev: Integer; Ffirst: Integer; Fnext: Integer; public property first: Integer read Ffirst write Ffirst; property last: Integer read Flast write Flast; property next: Integer read Fnext write Fnext; property prev: Integer read Fprev write Fprev; end; TLang = class (TObject) private FepisodeName: string; Foverview: string; public property episodeName: string read FepisodeName write FepisodeName; property overview: string read Foverview write Foverview; end; TData = class (TObject) private Flanguage: TLang; FairsAfterSeason: Integer; Ffilename: string; FEpisodeName: string; FlastUpdatedBy: Integer; FdvdChapter: Integer; FthumbHeight: string; FairsBeforeEpisode: Integer; FdvdSeason: Integer; FthumbAdded: TDateTime; FdvdEpisodeNumber: Integer; FcontentRating: string; FthumbAuthor: Integer; FlastUpdated: Integer; Foverview: string; Fdirectors: TArray<String>; FairedSeason: Integer; FabsoluteNumber: Integer; FisMovie: Integer; Fwriters: TArray<String>; Fid: Integer; FairedEpisodeNumber: Integer; FthumbWidth: string; FairsBeforeSeason: Integer; FdvdDiscid: string; FshowUrl: string; FsiteRating: Double; FseriesId: Integer; FproductionCode: string; FfirstAired: TDateTime; FguestStars: TArray<String>; FairedSeasonID: Integer; FsiteRatingCount: Integer; public property id: Integer read Fid write Fid; property airedSeason: Integer read FairedSeason write FairedSeason; property airedSeasonID: Integer read FairedSeasonID write FairedSeasonID; property airedEpisodeNumber: Integer read FairedEpisodeNumber write FairedEpisodeNumber; property episodeName: string read FEpisodeName write FepisodeName; property firstAired: TDateTime read FfirstAired write FfirstAired; property guestStars: TArray<String> read FguestStars write FguestStars; property directors: TArray<String> read Fdirectors write Fdirectors; property writers: TArray<String> read Fwriters write Fwriters; property overview: string read Foverview write Foverview; property language: TLang read Flanguage write FLanguage; property productionCode: string read FproductionCode write FproductionCode; property showUrl: string read FshowUrl write FshowUrl; property lastUpdated: Integer read FlastUpdated write FlastUpdated; property dvdDiscid: string read FdvdDiscid write FdvdDiscid; property dvdSeason: Integer read FdvdSeason write FdvdSeason; property dvdEpisodeNumber: Integer read FdvdEpisodeNumber write FdvdEpisodeNumber; property dvdChapter: Integer read FdvdChapter write FdvdChapter; property absoluteNumber: Integer read FabsoluteNumber write FabsoluteNumber; property filename: string read Ffilename write Ffilename; property seriesId: Integer read FseriesId write FseriesId; property lastUpdatedBy: Integer read FlastUpdatedBy write FlastUpdatedBy; property airsAfterSeason: Integer read FairsAfterSeason write FairsAfterSeason; property airsBeforeSeason: Integer read FairsBeforeSeason write FairsBeforeSeason; property airsBeforeEpisode: Integer read FairsBeforeEpisode write FairsBeforeEpisode; property imdbId: string read FcontentRating write FcontentRating; property contentRating: string read FcontentRating write FcontentRating; property thumbAuthor: Integer read FthumbAuthor write FthumbAuthor; property thumbAdded: TDateTime read FthumbAdded write FthumbAdded; property thumbWidth: string read FthumbWidth write FthumbWidth; property thumbHeight: string read FthumbHeight write FthumbHeight; property siteRating: Double read FsiteRating write FsiteRating; property siteRatingCount: Integer read FsiteRatingCount write FsiteRatingCount; property isMovie: Integer read FisMovie write FisMovie; constructor Create; destructor Destroy; override; procedure Dump; end; TstDiscovery = class(TObject) private Flinks: TLinks; Fdata: TArray<TData>; public property links: TLinks read Flinks write Flinks; property data: TArray<TData> read Fdata write Fdata; constructor Create; destructor Destroy; override; end; implementation { TData } constructor TData.Create; begin Flanguage := TLang.Create; end; destructor TData.Destroy; begin Flanguage.Free; inherited; end; procedure TData.Dump; begin Writeln('id:', id, ' episodeName: ', episodeName); Writeln('filename: ', filename); Writeln('firstAired: ', FormatDateTime('yyyy.mm.dd', firstAired)); Writeln; end; { TstDiscovery } constructor TstDiscovery.Create; begin FLinks := TLinks.Create; end; destructor TstDiscovery.Destroy; var d: TData; begin FLinks.Free; for d in data do d.free; inherited; end; end. Save this as 'TestStDirectory.dpr' - Correct the FileDir constant to point to where you have the StDirectory.json file. program TestStDirectory; {$APPTYPE CONSOLE} {$R *.res} uses System.Classes, System.SysUtils, System.RTTI, REST.Json, StJsonTypes in 'StJsonTypes.pas'; procedure TestStDiscovery; var FileDir: string; std: TStDiscovery; d: TData; f: TStringList; begin FileDir := 'D:\temp\Downloads\'; f := TStringList.Create; std := nil; try Writeln('Reading file'); // Make sure to remove the // comment from the .json file - Comments are not legal in Json f.LoadFromFile(FileDir + 'stdiscovery.json', TEncoding.utf8); Writeln('Create StDiscovery object from Json'); std := TJson.JsonToObject<TStDiscovery>(f.Text); Writeln(Length(std.data), ' elements found'); for d in std.data do d.Dump; Writeln('Converting object back to Json'); f.Text := TJson.ObjectToJsonString(std, [joIgnoreEmptyStrings, joIgnoreEmptyArrays, joDateIsUTC, joDateFormatISO8601]); Writeln('Saving Json to file'); f.SaveToFile(FileDir + 'stdiscovery_recreated.json', TEncoding.utf8); Writeln('Done'); finally f.Free; std.Free; end; end; begin try try TestStDiscovery; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; finally Write('Press Enter: '); Readln; end; end. Output: Reading file Create StDiscovery object from Json 17 elements found id:6143085 episodeName: The Vulcan Hello filename: episodes/328711/6143085.jpg firstAired: 2017.09.24 id:6143290 episodeName: Battle at the Binary Stars filename: episodes/328711/6143290.jpg firstAired: 2017.09.24 id:6321258 episodeName: Context Is for Kings filename: episodes/328711/6321258.jpg firstAired: 2017.10.01 id:6321259 episodeName: The Butcher's Knife Cares Not for the Lamb's Cry filename: episodes/328711/6321259.jpg firstAired: 2017.10.08 id:6353529 episodeName: Choose Your Pain filename: episodes/328711/6353529.jpg firstAired: 2017.10.15 id:6353530 episodeName: Lethe filename: episodes/328711/6353530.jpg firstAired: 2017.10.22 id:6362450 episodeName: Magic to Make the Sanest Man Go Mad filename: episodes/328711/6362450.jpg firstAired: 2017.10.29 id:6362451 episodeName: Si Vis Pacem, Para Bellum filename: episodes/328711/6362451.jpg firstAired: 2017.11.05 id:6362452 episodeName: Into the Forest I Go filename: episodes/328711/6362452.jpg firstAired: 2017.11.12 id:6402864 episodeName: Despite Yourself filename: episodes/328711/6402864.jpg firstAired: 2018.01.07 id:6452568 episodeName: The Wolf Inside filename: episodes/328711/6452568.jpg firstAired: 2018.01.14 id:6452569 episodeName: Vaulting Ambition filename: episodes/328711/6452569.jpg firstAired: 2018.01.21 id:6452570 episodeName: What's Past is Prologue filename: episodes/328711/6452570.jpg firstAired: 2018.01.28 id:6452571 episodeName: The War Without, the War Within filename: episodes/328711/6452571.jpg firstAired: 2018.02.04 id:6452573 episodeName: Will You Take My Hand? filename: episodes/328711/6452573.jpg firstAired: 2018.02.11 id:6854213 episodeName: Brother filename: episodes/328711/6854213.jpg firstAired: 2019.01.17 id:6903811 episodeName: "Will You Take My Hand?" Bonus Scene filename: episodes/328711/6903811.jpg firstAired: 2018.03.25 Converting object back to Json Saving Json to file Done Press Enter:
  11. David Heffernan

    Are we just "Cash Cows"?

    I'm less convinced that is so.
  12. Anders Melander

    Are we just "Cash Cows"?

    Nothing is stopping you from doing DI. Why do you need that "in the box"? As for MVVM I'm not convinced Delphi should do it at all. Not every pattern fits every language.
  13. Anders Melander

    Are we just "Cash Cows"?

    The book has many (good) points. One of them is that you can't naively solve a deadline problem by throwing more manpower at it; Time=Work/Resources is a meaningless equation. I assume this is what you allude to. However it also points out that you can solve a 2000 man-hour job in less that 2000 hours by allocating more manpower if the job can be split into separate, largely independent, tasks. I think that applies here.
  14. David Heffernan

    Are we just "Cash Cows"?

    The problem with that is the the problems tend to interact with each other.
  15. David Heffernan

    Are we just "Cash Cows"?

    The point of the book is that adding programmers won't necessarily result in a better output.
  16. Lars Fosdal

    Are we just "Cash Cows"?

    We usually hold off moving to new major versions until Update 1 is out, but we do make the move. As far as I am aware, nobody on my team has ever had a problem with moving their IDEs to new hardware after XE4, and we use the regular named user licenses w/o any license server. Apart from the quality of the initial release, my biggest Idera/EMBT gripe at the moment is understanding why the f..k they keep spamming me with emails suggesting that I order 10.4 with a discount. Not only do I get these from EMBT, but also from the local reseller. I am on a subscription, FFS!
  17. Lars Fosdal

    Parsing JSON response from TVDB

    std := TJson.JsonToObject<TStDiscovery>(YourJsonStringHere);
  18. CarloM

    How to get GPS coords in android - Delphi Sydney

    Thank Dave. works like a charm with Delphi Sydney
  19. Stefan Glienke

    Open Type Arrays?

    If we just could write class operator Implicit<T>(const value: T): TValue; ... oh wait... we can! type TValueHelper = record helper for TValue class function &&op_Implicit<T>(const value: T): TValue; static; end; class function TValueHelper.&&op_Implicit<T>(const value: T): TValue; begin TValue.Make(@value, System.TypeInfo(T), Result); end;
  20. Stefan Glienke

    FreeAndNil or NilAndFree ?

    FreeAndNil is correct from the consumer point of view - you call the routine it frees the thing and then once it returns you have a nil reference. That it sets the reference to nil before it actually calls Free is an implementation detail to protect against potentially recursive attempts to FreeAndNil the same reference or accessing an object which is undergoing destruction and probably a result of the convoluted architecture of TComponent and Co.
  21. Further on, the function is to ensure a properly nulled reference, even if something fails. A object that failed during Free/Destroy is usually not usable any longer anyways.
  22. David Heffernan

    FreeAndNil or NilAndFree ?

    Destructors must not raise exceptions. My personal view is that if they do then the best course of action is to terminate the process.
  23. Remy Lebeau

    Present status of Indy

    Still actively developed (by me). RAD Studio 10.4 includes an updated trunk version from Indy's GitHub repo from about 2 months ago. I'm not in charge of, or involved with, how Embarcadero incorporates help files for 3rd party components. But I do recall that Indy's help files are included, somewhere. Although, Indy's documentation is quite dated, it hasn't been updated in many years. There have been property/interface changes made over the years that still need to be documented.
  24. sjordi

    AES Encryption - FMX

    I think that the free FMX TurboPower Lockbox offers AES encryption and it works on any platform. Did check whether AES256 is supported, but it's worth a look. Install it via GetIt
  25. aehimself

    Parsing JSON response from TVDB

    @Lars Fosdal Isn't importing RTTI is a huge bloat to parse JSON? A bit more manual work, but for example all class properties could be read and filled from a TJSONObject(TJSONObject.ParseJSONValue(contentsting)).
×