Jump to content

elGringo

uniGUI Subscriber
  • Posts

    434
  • Joined

  • Last visited

  • Days Won

    13

Everything posted by elGringo

  1. Hi, if i use ServiceLocator from spring4d and need singleton per thread, then where shoud i put my container better - in serverModule or mainModule? I do smth. like this var container: TContainer; begin container := GlobalContainer; container.RegisterInstance<TContainer>(container); container.RegisterType<TServiceLocatorAdapter>.AsSingletonPerThread; container.RegisterType<TTestService>.AsSingletonPerThread; container.Build; end;
  2. Hi, on build having hints. Is it my glitch or common? Delphi Sydney UniGUi 1.90.0.1539 All of them from uIndyFolder, so it could be fixed, but anyway it is interesting to me is that trash that should be removed in future? [dcc32 Hint] uIdStackWindows.pas(1428): H2077 Value assigned to 'LAddress' never used [dcc32 Hint] uIdStackWindows.pas(1794): H2077 Value assigned to 'TIdSocketListWindows.GetItem' never used [dcc32 Hint] uIdIOHandler.pas(2590): H2077 Value assigned to 'TIdIOHandler.WriteFile' never used [dcc32 Hint] uIdThread.pas(670): H2443 Inline function 'TList.Remove' has not been expanded because unit 'System.Types' is not specified in USES list [dcc32 Hint] uIdCustomHTTPServer.pas(1279): H2077 Value assigned to 'LCloseConnection' never used [dcc32 Hint] uIdSSLOpenSSL.pas(1268): H2077 Value assigned to 'Lin' never used [dcc32 Hint] uIdSSLOpenSSL.pas(1355): H2077 Value assigned to 'Lin' never used [dcc32 Hint] uIdSSLOpenSSL.pas(2580): H2077 Value assigned to 'TIdServerIOHandlerSSLOpenSSL.Accept' never used Regards, Stan
  3. Forever Young !) I'm coding on Delphi and enjoy it )))
  4. Hi, yes, Desktop Applications directly connected to a DB server. DB used local as usually.
  5. Delphi forever young! UniGUI is the best!
  6. Hi, everyone. On my work, we have a lot of programs on Delphi. But ! Our government told that we have to move to national software to that is in registry of government to 2021 year. And in this registry only one operational system - Linux. So, we have 2 years to do smth. Could anyone give an advice what variants possible to not to change stack ? We have variant to move everything to .net core and react. So, is any way to solve this in Delphi way ? I found fmx linux framework, so could it be a decision ? Or maybe some server side on Delphi for Linux ? Is smth. interesting in UniGUI roadmap ?
  7. No! I use UniGUI in my projects. It looks like this is the best Web framework for Delphi. Hope Mr. Farshad will develop it to next years! Regards...
  8. Thnks! Just thought there is the way that shows "SomeUnit, string 157, memoryLeak 120 Kb, TStringList" ))
  9. And what about this example? Wrapper for classes, based on ARC ? Looks smart ))) So, you may avoid try... finally... and just Create Use Forget ))) unit uSmartPointer; interface type ISmartPointer<T> = reference to function: T; TSmartPointer<T: class, constructor> = class(TInterfacedObject, ISmartPointer<T>) private FValue: T; function Invoke: T; procedure SetValue(const Value: T); public constructor Create; overload; constructor Create(AValue: T); overload; destructor Destroy; override; function Extract: T; property Value: T read FValue write SetValue; end; implementation constructor TSmartPointer<T>.Create; begin inherited Create; FValue := T.Create; end; constructor TSmartPointer<T>.Create(AValue: T); begin inherited Create; FValue := AValue; end; destructor TSmartPointer<T>.Destroy; begin FValue.Free; inherited; end; function TSmartPointer<T>.Invoke: T; begin Result := FValue; end; procedure TSmartPointer<T>.SetValue(const Value: T); begin FValue := Value; end; function TSmartPointer<T>.Extract: T; begin Result := FValue; FValue := nil; end; end. Example of use procedure Smart; var sl: ISmartPointer<TStringList>; begin sl := TSmartPointer<TStringList>.Create(); sl.Add('I am inside automanaged StringList'); end;
  10. and besides, my topic start code here gives 2 possibilities -manage code manually as usual, by grouping instances by tag -100 % clear on App Close if you have forgotten to clear smth inside the scope (protection from human factor...) Regards...
  11. Another alternative to the class i showed is ARC, but here we should know about weak, unsafe links and raw pointers I'm reading now book Delphi Memory Management for Classic and ARC Compilers...
  12. hm... agree with you, just it was start for discussion about the memory management in Delphi. So, could you say how do you look for memory leaks with fastMM - i don't know that for the moment. I use only ReportMemoryLeaksOnShutdown := true; But this approach only says me that there is a memory leak and what is leaking TStringList or etc... But how, for example you find memory leak in special exact place of code? Regards, Stan
  13. look at this class unit uGC; interface uses System.Generics.Collections, Rtti, System.Classes; type TGarbageCollector = class(TComponent) public const DEFAULT_TAG = 'DEFAULT_TAG'; private items: TDictionary<TObject, string>; public destructor Destroy; override; constructor Create(AOwner: TComponent); override; function Add<T>(item: T): T; overload; function Add<T>(item: T; const tag: string): T; overload; procedure Collect(const tag: string); end; var GC: TGarbageCollector; implementation uses System.Types, System.SysUtils; constructor TGarbageCollector.Create(AOwner: TComponent); begin inherited; items := TObjectDictionary<TObject, string>.Create([doOwnsKeys]); end; destructor TGarbageCollector.Destroy; begin items.free(); inherited Destroy; end; function TGarbageCollector.Add<T>(item: T): T; begin result := Add(item, DEFAULT_TAG); end; function TGarbageCollector.Add<T>(item: T; const tag: string): T; var obj: TObject; v: TValue; begin v := TValue.From<T>(item); if v.IsObject then begin items.add(v.AsObject, tag); result := item; end else raise Exception.Create('not an Object'); end; procedure TGarbageCollector.Collect(const tag: string); var key: TObject; item: TPair<TObject, string>; gcList: TList<TObject>; begin gcList := TList<TObject>.Create(); try for item in items do begin if (item.Value = tag) then gcList.add(item.Key); end; for key in gcList do items.remove(key); finally gcList.free(); end; end; end. Create it program GarbageCollector; uses Vcl.Forms, uMain in 'uMain.pas' {Main}, uGC in 'uGC.pas', uSomeClass in 'uSomeClass.pas'; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; GC := TGarbageCollector.Create(Application); // <<< Application.CreateForm(TMain, Main); Application.Run; end. use it someInstance := GC.Add(TSomeClass.Create(nil), 'TSomeClassTag'); // do smth with someInstance //now destroy GC.Collect('TSomeClassTag'); // anotherInstance := GC.Add(TSomeClass.Create(nil), 'TSomeClassTag'); // do smth with anotherInstance // not destroying here - will be destroyed on app destroy... what do you think?
  14. Great ))) We can open museum here ))) But as for seriously, we could be any age, any technology stack, more important is the love of what you are doing and how. On any language we can do good and bad things, popularity will always be changable. Choose yours! When i started this topic, i tried to understand, should i continue with Delphi or switch to C#, as for now, i understand - both of them will always have their lovers) And i have projects on both as for now. Knowledge of different technologies enriches your skills as a programmer. For ex. i love mvc pattern from asp mvc and use it in my current projects, 'cause it gives clear transperent code... And of course, UniGUI, the best framework for Delphi and Farshad is the Genious of Delphi ))) Regards...
  15. Unit testing quite easily maybe done with DUnitX. But "Clean Code" and "Readability" - it is from practice... Which code pattern to use is also good question...
  16. Asked myself - answered myself my workAround procedure TLeftMenu2.OnClickElement(Sender: TObject); function getLeftMenuElement(aID: integer): TLeftMenu2Element; var i: Integer; begin Result := nil; for i := 0 to FOL.Count - 1 do if FOL[i].Tag = aID then begin result := FOL[i]; break; end; end; var leftMenu2Element: TLeftMenu2Element; begin if (Sender is TUniLabel) then leftMenu2Element := getLeftMenuElement((Sender as TUniLabel).Tag); showmessage(leftMenu2Element.lName.Caption); end;
  17. Hi, having 2 classes 1 frame is created on another Second frame on 1 frame there is TUniLabel for example i'm trying to handle onClick event of label in Second frame and assign it like FOL[i].lName.OnClick := OnClickElement; here i have "Invalid type Cast" procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent as TLeftMenu2Element).ClassName // << invalid type Cast ); // end; As Delphi coder I'm doing everything correct, but as UniGUI coder i'm being not so experienced i tried to do things like procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent.Parent).ClassName // ); // end; and on click i have TUniSimplePanel - which is not my class. Is any way to get instance of TLeftMenu2Element - 1 frame on click in 2 frame? Below full code of 2 frames unit uLeftMenu2Element; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIFrame, uniGUIBaseClasses, uniPanel, uniImage, uniLabel; type TLeftMenu2Element = class(TUniFrame) iPic: TUniImage; lName: TUniLabel; procedure UniFrameCreate(Sender: TObject); procedure iPicClick(Sender: TObject); procedure lNameClick(Sender: TObject); private FIsExpanded: boolean; procedure SetIsExpanded(const Value: boolean); { Private declarations } public { Public declarations } property IsExpanded: boolean read FIsExpanded write SetIsExpanded; end; implementation {$R *.dfm} uses uLeftMenu2; procedure TLeftMenu2Element.iPicClick(Sender: TObject); begin if FIsExpanded then begin FIsExpanded := false; iPic.Picture.LoadFromFile('pics/arrowRight16x16.png') end else // if not expanded begin FIsExpanded := true; iPic.Picture.LoadFromFile('pics/arrowDown16x16.png'); end; end; procedure TLeftMenu2Element.lNameClick(Sender: TObject); begin // end; procedure TLeftMenu2Element.SetIsExpanded(const Value: boolean); begin FIsExpanded := Value; end; procedure TLeftMenu2Element.UniFrameCreate(Sender: TObject); begin iPic.Picture.LoadFromFile('pics/arrowRight16x16.png'); lName.Top := trunc(Self.Height / 2 - lName.Height / 2); iPic.Top := trunc(Self.Height / 2 - iPic.Height / 2); end; end. And another class unit uLeftMenu2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIFrame, uLeftMenu2Element, System.Generics.Collections, uniGUIBaseClasses, uniPanel; type TLeftMenu2 = class(TUniFrame) procedure UniFrameCreate(Sender: TObject); procedure UniFrameDestroy(Sender: TObject); private { Private declarations } FOL: TObjectList<TLeftMenu2Element>; procedure OnClickElement(Sender: TObject); public { Public declarations } procedure LoadGoodsTree; // procedure LoadChildren(aID: integer); end; implementation uses FireDAC.Comp.Client, MainModule, uniLabel; {$R *.dfm} procedure TLeftMenu2.LoadGoodsTree; procedure loadNullLevel(); var q: TFDquery; i: integer; h: integer; itemName: string; begin h := 0; q := TFDquery.Create(nil); try with q do begin Connection := UniMainModule.DB.FDConnection; sql.Text := 'SELECT * FROM sewworld_db.goods where idParent is NULL order by sortIndex'; Disconnect(); Open; while not EOF do begin i := FOL.Add(TLeftMenu2Element.Create(Self)); itemName := FieldByName('name').AsString; if itemName.Length > 15 then itemName := itemName.Substring(0, 15) + '...'; FOL[i].lName.Caption := itemName; FOL[i].Parent := Self; FOL[i].Left := 0; FOL[i].Top := h; FOL[i].Show; FOL[i].lName.OnClick := OnClickElement; h := h + FOL[i].Height; Next; end; Close; end; finally q.Free; end; end; begin loadNullLevel(); end; procedure TLeftMenu2.OnClickElement(Sender: TObject); var i: integer; begin showmessage( // ((Sender as TUniLabel).Parent as TLeftMenu2Element).ClassName // ); // end; procedure TLeftMenu2.UniFrameCreate(Sender: TObject); begin FOL := TObjectList<TLeftMenu2Element>.Create; end; procedure TLeftMenu2.UniFrameDestroy(Sender: TObject); begin FOL.Free; end; end.
  18. Thank you delphiDude !!! I will watch your example. below - decision from DD procedure TMainForm.bTestClick(Sender: TObject); var html: string; begin html := '<a href="#" onclick="return myFunction();">Click Me</a>' + // '<script>' + // 'function myFunction() {' + // // 'replaceThis; ' + // 'ajaxRequest(MainForm.window, "getFile", [ "filePath=12345", "param1=B"]);' + // 'return;' + // '}' + // '</script>'; // FFilePath := f.qFiles.FieldByName('filePath').AsString; UniSession.AddJS(UniHTMLMemo.JSName + '.execCmd(''InsertHTML'',''' + html + ''')'); end; please try to use " instead of ' and '
  19. the only problem is i have js exception (see picture) my temporary decision is using timer - but it is not Ok decision ! html := '<a href="#" onclick="return myFunction();">' + f.qFiles.FieldByName('fileName').AsString + '</a>' + // '<script>' + // 'function myFunction() {' + // 'replaceThis; ' + // <<<<<<<<<<<<<<<< !!! Here // 'ajaxRequest(MainForm.window, ''getFile'', [ ''filePath=12345'', ''param1=B'']);' + // 'return;' + // '}' + // '</script>'; FFilePath := f.qFiles.FieldByName('filePath').AsString; UniSession.AddJS(UniHTMLMemo.JSName + '.execCmd(''InsertHTML'',''' + html + ''')'); tReplace.Enabled := true; and on timer tReplace.Tag := tReplace.Tag + 1; // inc(tReplace.Tag); if tReplace.Tag = 2 then begin UniHTMLMemo.Text := StringReplace(UniHTMLMemo.Text, 'replaceThis', 'ajaxRequest(MainForm.window, ''getFile'', [ ''filePath=' + FFilePath + ''', ''param1=B'']);', [rfReplaceAll]); tReplace.Enabled := false; end; What could be the problem? You can easily reproduce the case by placing UniHTMLMemo and applying this code from previous message.
  20. ok, my decision of my problem is <html> <a href="#" onclick="return myFunction();">Link</a> <script> function myFunction() { alert('here'); ajaxRequest(MainForm.window, 'getFile', [ 'filePath=12345', 'param1=B' ]); } </script> </html> and on Server Side if SameText(EventName, 'getFile') then begin showmessage(Params.Values['filePath']); end;
  21. Yes, file in root/UploadFolder What you suggest?
  22. ok, Progress, i can do like this in HTML <html> <a href="http://www.google.com" onclick="return myFunction();">Link</a> <script> function myFunction() { document.getElementById(".myDiv").style.flexGrow = "5"; } </script> </html> next step is to learn to request through ajaxRequest from free HTML - is that possible?
×
×
  • Create New...