Jump to content

PeterBelow

Members
  • Content Count

    127
  • Joined

  • Last visited

  • Days Won

    7

Everything posted by PeterBelow

  1. A kind of transaction log saved to local storage (a file) may serve your purpose. You can write entries to a file using a write followed by a flush operation (or a full open - write - close cycle) . While not very fast it will ensure the entry is either written completely or not all (if the PC suffers a power failure, for example). Your operation would then follow this scheme: Write the intent to print, with the ID of the item to print, to the log print the item write the success of the operation to the log save it to the database write an end of transactio to the log or delete the log On (re)start the program can then look for a transaction log and analyse it to see how far it got on the last run.
  2. PeterBelow

    DelphiCon 2021 Code Examples

    At least one of the examples is on github: https://github.com/gustavomenabarreto/delphicon2021 Perhaps you can find more in the replays on Youtube: DelphiCon 2021 Playlist It's probably up to the speakers to make the code for their talk available somewhere...
  3. In this case it is, but one should never make assumptions about in which order the parts of a complex expressions are evaluated. It may even change depending on compiler flags, e.g. optimization on or off, stack frames on or of, range and overflow checks.
  4. PeterBelow

    Delphi profiler

    Set the Capacity property of your list objects to a suitably high value before you start adding objects, that can greatly improve performance since it cuts down cases where the list has to grow its internal array.
  5. PeterBelow

    Interface question

    @David IMO you are mixing data with UI in a way that only causes problems. You should use a list class instance (nonvisual) to hold objects that represent a student, each of which holds a list of the classes taken with the score obtained. The list class can then have a method to compose the items for a listview you pass as parameter to the method. If you need that you can store the reference to the student object in the corresponding listitem's Data property, but the lifetime management of the objects is the duty of the list class, not that of the UI listview.
  6. PeterBelow

    calculete time in delphi

    DecodeTime is the wrong method to use since it decodes a time point, not a time interval. The System.Diagnostics.TStopwatch record may be of more use for your problem. Add a private field FStopwatch: TStopwatch; to your form. In the OnCreate event you start the stopwatch with FStopwatch := TStopwatch.StartNew; When you want to know the elapsed time call FStopwatch.Stop first and then examine the Elapsed property. It returns a TTimespan record, which has properties to dissect the time interval into days, hours, minutes etc.
  7. PeterBelow

    TControlList - Jump to Selected

    Tcontrollist inherits the ParentBackground property but does not publish it, it is protected. You can try to set it to true in code, using a cracker class: type TControllistCracker = class(TControllist); ... TControllistcracker(Controllist1).Parentbackground := true; Untested!
  8. PeterBelow

    SplitString

    There is nothing wrong with the code you posted, other than the comma instead of semicolon after the "string" in the var section. Perhaps you have another SplitString function closer in scope than StrUtils.SplitString here. If you hover the mouse over SplitString, what does the code insight popup tell you where it's from?
  9. SudokuHelper is an application that acts like an electronic Sudoku grid. It supports 9x9, 12x12, and 16x16 Sudokus, both in the classic and Gosu variant, where cells can be marked to only accept even numbers. The application neither creates Sudokus itself nor provides a solver for them; it is just a more convenient way to solve a Sudoku from a magazine or other external source than doing it on paper, using pencil and eraser. The application's main features are: Invalid cell values are marked in red. Candidate values can be added and removed from a cell. Setting a cell's value will automatically remove candidates no longer possible in other cells. All actions can be undone, the undo stack is only limited by available memory. Named marks can be set for the current undo stack state and one can later restore the stack to such a named mark. The complete Sudoku can be saved to file, including the undo stack, and later loaded again from such a file. The project can be found on GitHub: https://github.com/PeterBelow/SudokuHelper The code is a good example (IMO) of how to uncouple the UI from the "buisness" code using interfaces, in a kind of MVC design. It is free (public domain) without restrictions.
  10. PeterBelow

    Paste file from clipboard to blob field (Remote Desktop)

    Google for "ole drag and drop delphi", that may turn up something useful.
  11. PeterBelow

    Trim

    Are you looking for something like this? {! <summary> Remove all characters in aSet from the passed string and return the resulting string</summary>} function RemoveCharsInSet(const S: string; const aSet: TSysCharset):string; var I: Integer; begin Result := S; for I := Length(S) downto 1 do if S[I] in aSet then Delete(Result, I, 1); end; {! <summary> Remove all characters considered whitespace from the passed string and return the resulting string</summary>} function RemoveWhitespace(const S: string):string; const Whitespace = [#0..' ']; begin Result := RemoveCharsInSet(S, Whitespace); end;
  12. PeterBelow

    Long term availability of Community Edition

    Perhaps, but keep in mind that for MS developer tools are not the major part of their business by far, so the comparison is a bit unfair.
  13. PeterBelow

    Long term availability of Community Edition

    Well, there are heaps of sites that claim to do just that, just google for "life expectancy calculator"
  14. PeterBelow

    Long term availability of Community Edition

    It's difficult to make predictions, especially if they concern the future :). What may be important to know for you is this, however: The licence for the community edition cannot be renewed; if you need to install it on a new computer you need to get a new licence key, which is no problem, however. When a new Delphi/RAD Studio version comes out there is also a new community edition, usually available after a short delay. The previous version's community edition is then no longer available and you cannot get new licence keys for it anymore, so have to move to the latest edition if your old licence expires (it is limited to 1 year if memory serves).
  15. PeterBelow

    Pos

    I think the best way is to dissect the input into "words" and then assemble the parts you want from that list. procedure TForm1.Button1Click(Sender: TObject); var LWords: TStringlist; begin LWords := TStringlist.Create(); try LWords.Delimiter := ' '; LWords.DelimitedText := edit1.Text; if LWords.Count >= 2 then edit1.Text := LWords[0] + ' ' + LWords[1]; finally LWords.Free; end; end; Note that there also is a function PosEx(const SubStr, S: string; Offset: Integer): Integer in unit System.StrUtils that allows you to start the search at a position other than 1.
  16. PeterBelow

    SAX parser

    http://saxforpascal.sourceforge.net is quit good in my experience, I used it in a few projects a couple of years ago.
  17. PeterBelow

    Changing UserDataFolder in TWebBrowser with webview

    Well, TWebbrowser (in D11) has a protected method function GetEdgeInterface: TEdgeBrowser; To get at it you can use a cracker class, e.g. declared in the implementation section of the form unit containing the TWebbrowser control. type TWebBrowserCracker = class(TWebbrowser); In your code you can then do something like var Edge: TEdgeBrowser := TWebbrowserCracker(Webbrowser1).GetEdgeInterface; if Assigned(Edge) then begin Edge.UserDataFolder := SomeDirectory; Edge.ReinitializeWebView; end; Completely untested, so use at your own risk!
  18. InternalHelperRegistry is a "global" variable declared in the implementation section of the unit and will stay around for the lifetime of the application; it is set to nil in the unit finalization. It has been some time since I last looked at the memory manager implementation, but a lock there does not protect against a race condition in the code assigning the resulting reference to a variable elsewhere.
  19. Well, interface references are pointers, so the problem is just how to make sure the reference count stays correct, which the code does. The singleton template the code was created from is quite old, however, predating the appearance of TMonitor by several years. There may be a cleaner way to implement this these days, but I don't like to change working code if there's no pressing reason to do so.
  20. That code comes from the forin template that comes with newer versions of Delphi. Sorry for the inconvenience, but since I program mostly for my own use i'm not much concerned with compatibilty with older Delphi versions and simply did not notice this as a potential problem.
  21. http://rvelthuis.de/articles/articles-pointers.html
  22. PeterBelow

    SetFocus issue

    That sounds as if the form is no longer the foreground window after the ActiveX control hasloaded the file. Try to add a BringToFront; after the LoadFile line.
  23. PeterBelow

    Form no longer repaints after WM_SETREDRAW

    Just a guess: check the value of self.handle in both methods to verify they are the same. VCL forms are prone to recreate their window handle at the drop of a hat...
×