alogrep
Members-
Content Count
173 -
Joined
-
Last visited
Everything posted by alogrep
-
Hi. I used the code below to print Richedit in pre-XE Delphi for many years. Now it get stuck in the repeat loop: In my test, the first nextchar gives 571, in the next and all subsequent cals gives 570. Gence the loop hangs. Does Anybody have any ideas as to what has changed or what am I doing wrong? Printer.BeginDoc; try With Printer.Canvas Do Begin printresX := GetDeviceCaps( handle, LOGPIXELSX ); printresY := GetDeviceCaps( handle, LOGPIXELSY ); printarea:= Rect( printresX div 2, // 0.5 inch left margin printresY div 2, // 0.5 inch top margin Printer.PageWidth - (printresX div printresX), // 0.5 inch right margin Printer.PageHeight - (printresY-2) // 1 inch bottom ); richedit_outputarea := Rect( (printarea.left) * 1440 div printresX, ((printarea.top) * 1440 div printresY), (printarea.right) * 1440 div printresX, (printarea.bottom)* 1440 div printresY ); fmtRange.hDC := Handle; // printer handle fmtRange.hdcTarget := Handle; // ditto fmtRange.rc := richedit_outputarea; fmtRange.rcPage := Rect( 0, 0, Printer.PageWidth * 1440 div printresX, Printer.PageHeight * 1440 div printresY ); fmtRange.chrg.cpMin := 0; fmtRange.chrg.cpMax := richedit1a.GetTextLen; // remove characters that need not be printed from end of selection. // failing to do so screws up the repeat loop below. S:= richedit1a.Text; While (fmtRange.chrg.cpMax > 0) and (S[fmtRange.chrg.cpMax] <= ' ') Do Dec(fmtRange.chrg.cpMax); pageof:=0; //total number of pages Repeat // only count pages here. // Render the text nextChar := richedit1a.Perform( EM_FORMATRANGE, 0, Longint(@fmtRange)); fmtRange.rc := richedit_outputarea; Inc(pageof); If nextchar < fmtRange.chrg.cpMax Then Begin // more text to print fmtRange.chrg.cpMin := nextChar; End; { If } Until nextchar >= fmtRange.chrg.cpMax;
-
Thanks Peter. I copied from the TcustonRicheit.Print() founcion to modify my code (now includes printing multiple pages) as shown in the code section below. It works just fine. var ...... MaxLen: Integer; TextLen: TGetTextLengthEx; ........ try Printer.BeginDoc; TextLen.Flags := GTL_NUMCHARS; TextLen.CodePage := 1200; // Unicode MaxLen := SendMessage(richedit1a.Handle, EM_GETTEXTLENGTHEX, LPARAM(@TextLen), 0); try With Printer.Canvas Do Begin printresX := GetDeviceCaps( Printer.Canvas.handle, LOGPIXELSX ); printresY := GetDeviceCaps( Printer.Canvas.handle, LOGPIXELSY ); if reptype= 13 then printarea:=Rect(1,printResY div 2, Printer.PageWidth-1,Printer.PageHeight - (printresY-2)) else printarea:= Rect( printresX div 2, // 0.5 inch left margin printresY div 2, // 0.5 inch top margin Printer.PageWidth - (printresX div printresX), // 0.5 inch right margin Printer.PageHeight - (printresY-2) // 1 inch bottom ); richedit_outputarea := Rect( (printarea.left) * 1440 div printresX, (printarea.top * 1440 div printresY), (printarea.right) * 1440 div printresX, (printarea.bottom)* 1440 div printresY ); fmtRange.hDC := Printer.Canvas.Handle; // printer handle fmtRange.hdcTarget := Printer.Canvas.Handle; // ditto fmtRange.rc := richedit_outputarea; fmtRange.rcPage := Rect( 0, 0, Printer.PageWidth * 1440 div printresX, Printer.PageHeight * 1440 div printresY ); fmtRange.chrg.cpMin := 0; fmtRange.chrg.cpMax := richedit1a.GetTextLen; pageof:=0; //total number of pages Repeat // only count pages here. // Render the text nextChar := SendStructMessage(richedit1a.Handle, EM_FORMATRANGE, 0,fmtRange); Inc(pageof); If nextchar < MaxLen Then Begin // more text to print fmtRange.chrg.cpMin := nextChar; End; { If } Until nextchar >= Maxlen; // Free cached information richedit1a.Perform( EM_FORMATRANGE, 0, 0); fmtRange.hDC := Printer.Canvas.Handle; // printer handle fmtRange.hdcTarget := Printer.Canvas.Handle; // ditto fmtRange.rc := richedit_outputarea; fmtRange.rcPage := Rect( 0, 0, Printer.PageWidth * 1440 div printresX, Printer.PageHeight * 1440 div printresY ); fmtRange.chrg.cpMin := 0; fmtRange.chrg.cpMax := richedit1a.GetTextLen; page := 1; Repeat // now actually print // Render the text nextChar := SendStructMessage(richedit1a.Handle, EM_FORMATRANGE, 1,fmtRange); if not (reptype in [9,10,12]) then with dm1.systable do begin if reptype <> 13 then Textout(printarea.left{+printresx},printarea.bottom+ (printresy div 2),FieldByName('Name').AsString+' '+LG('Report Printed')+' '+FormatDateTime('dd-mmm-yyyy hh:mm:ss',Now)); TextOut(printarea.right-printresx,printarea.bottom+ (printresy div 2), 'Page: '+inttostr(page)+ ' ' +lg('of') +' '+IntToStr(pageof)); end; Inc(page); If nextchar < MaxLen Then Begin // more text to print printer.newPage; fmtRange.chrg.cpMin := nextChar; End; { If } Until nextchar >= MaxLen; // Free cached information richedit1a.Perform( EM_FORMATRANGE, 0, 0); end; printed:=true; if cap1<> '' then begin richedit1a.lines.delete(richedit1a.lines.count-1); richedit1a.lines.delete(richedit1a.lines.count-1); end; finally Printer.EndDoc; end; The relevnt part seems to be this way of ca,culatin the texzt length: TextLen.Flags := GTL_NUMCHARS; TextLen.CodePage := 1200; // Unicode MaxLen := SendMessage(richedit1a.Handle, EM_GETTEXTLENGTHEX, LPARAM(@TextLen), 0);
-
I g=found this code here: https://stackoverflow.com/questions/22234371/how-to-print-the-contents-of-a-richedit. It seems to work pretty well. However, I like to print a small logo (saved as abitmap separately) at the sart of the printing, followed by the richedit content, all on the same page.. Is that possible? procedure PrintRichEdit(RichEdit: TRichEdit; const Caption: string; const PrinterMargin: Integer); //the units of TRichEdit.PageRect are pixels, units of PrinterMargin are mm var PrinterHeight, PrinterWidth: Integer; LogPixels, PrinterTopLeft: TPoint; PageRect: TRect; Handle: HDC; begin Handle := Printer.Handle; LogPixels := Point(GetDeviceCaps(Handle, LOGPIXELSX), GetDeviceCaps(Handle, LOGPIXELSY)); PrinterTopLeft := Point(GetDeviceCaps(Handle, PHYSICALOFFSETX), GetDeviceCaps(Handle, PHYSICALOFFSETY)); PrinterWidth := Printer.PageWidth; PrinterHeight := Printer.PageHeight; PageRect.Left := Max(0, Round(PrinterMargin*LogPixels.X/25.4) - PrinterTopLeft.X); PageRect.Top := Max(0, Round(PrinterMargin*LogPixels.Y/25.4) - PrinterTopLeft.Y); PageRect.Right := PrinterWidth-PageRect.Left; PageRect.Bottom := PrinterHeight-PageRect.Top; if (PageRect.Left>=PageRect.Right) or (PageRect.Top>=PageRect.Bottom) then //the margins are too big PageRect := Rect(0, 0, 0, 0); RichEdit.PageRect := PageRect; RichEdit.Print(Caption); end;
-
Thanks Peter. I applied your suggestions (I did not have the Newpage, because this richedit text will never exceed 1 page). However, checking if nextchar <=fmtRange.chrg.cpMin allows me to abort printing but it does not tell me what is the error, why that happens.
-
Hi I have had extremely bad experiences upgrading from one minor version to another. I have these questions, if anyone is willing to help. 1. if I upgrade from, in this case, 11.2 to 11.3, after upgrading do I need to re-install all 3rd party products and my own packages? 2. Do I need to UNINSTALL the old version, or is it better to NOT uninstall it? From the windows for the installation I get contradictory suggestions: it first says "you need to uninstall", but then the NO radio button is checked by default
-
Uwe that "the vast majority had no problems with this update" is of no sonsolation to me. Now it has become completely unworkable. It freezes all the time, with no apparent pattern.
-
QED.. I had no Getit packages. But after installing 11.3, no the IDE freezes like crazy. Once if I clic File, another if I click Search, at times if i am just moving the cursor around. Does anybody have an idea on hoiw to get rid of this annoyance?
-
Hola Does anybody have experience with E-Payment processing software for Delphi? Any suggestions for a good good software for Delphi (11)? How does it work, once the software is integrated into the APP: is it a one time licence or does the developer have to pay for each end-user that uses the app. I am 100% new to this field. Thanks Enrico
-
Thank you very much, FPiette. I have two questions, if you will 1. The customer (the restaurant) to use this type of API requires https on the PC (server) in the restaurant? 2. Aside from entering the credit card data manually in the POS App, are there ways to scan/read these data and send them to the API?
-
David. 1. As for the country, I did write "The client that asked me, in Mexico,...." 2. I think there is a fundamental misunderstanding caused by the word POS. I never meant POS terminals. I mean a POS application: where the waiter enters the order. At the end, when the customer pays the cashier scans the credit card with the bank provided terminal, and then has to duplicate the data entering in the database of the app (e.g "payd by visa"). He would like to enter or read the credit card data (in some ways, maybe even with some type of scanner) directly in the application (that would send the data to a real payment-processing site on the web), so to avoid duplication. If something like this is not possible, I will tell my client "sorry, that is beyond my reach".
-
Embarcadero istself claims a "Rapidly Deploy Blazing Fast Payment Solutions On Windows", https://blogs.embarcadero.com/rapidly-deploy-blazing-fast-payment-solutions-on-windows/ but when you try to access the site it returns a 404 error. https://getitnow.embarcadero.com/InPay-20.0.7582/
-
Hola David. The field is the subject and the content of the post: E-Payment processing software for Delphi. Perhaps is not the right wording, but what I was trying to get suggestions/hints about is how to allow a POS application to process a payment made with credit/debit cards. I found something, for example Stripe and a Delphi wrapper (https://github.com/gmurt/ksStripe). It appears that one could add that payment processing library to an application. I do not intend to develop myself a Stripe-like software, but use it or something similar in a Delphi 11 app. I have developed my own application, should I suggest to my client to buy Square?. The client that asked me, in Mexico, did so because he had seen it in another restaurant. I assume then that it can be done. I was asking for some help on the "basics" where to start from.
-
Rollo62. Yes I am talking about Windows. And there are 2 scenarios: one all inside the restaurant (with the Server connected to the web), the other when a customer posts an order remotely and wants to pay remotely.
-
Thanks, David. My case is simple, no next eBay or Amszon. . I have a POS for restaurants, and one client has asked me if I could integrate the payment process into the App. Now they use the terminals supplied by their Bank for register the payment, then manually register that payment in the App. I told him I would investigate. SORRY. I forgot to add that the client also wants his customer to be able to order and pay online, remotely. I can handle the ordering part, but have no idea about the payment processing online.
-
Determine if a stringgrid has ssboth or sshorizontal scrollbars defined
alogrep posted a topic in VCL
HI. I have this line of code if ( g.scrollbars =ssBoth) or (g.scrollbars=ssHorizontal) then .... (g is a tstringgrid); I get the error Incompatible styles: Tscrollstyles and Enumeration. If I have only if ( g.scrollbars =ssBoth) then .. (and with only g.scrollbars=ssHorizontal I still get the error) I get no error message. How can I determine if the scrollbars at design time is defined as ssBoth or ssHorizontal? Any help? -
Determine if a stringgrid has ssboth or sshorizontal scrollbars defined
alogrep replied to alogrep's topic in VCL
Thanks Remy. Your solution worked. I cannot find anywhere a componet that defines TScrollStyles. -
HI. Does anybody have an idea of how to fix this strange behaviour? I am trying to set version info (see m1.jpg) and I get the mysterious message shown in m2.jpg ('....... only contain 2,3, or 4 numbers....???). Thanks.
-
I need help again with pngimage. I have some custom control containing a Tpicture. The Pictures were loaded as TpngObject. I was told (Uwe Raabe) that if I load and then save the form containing the controls, they would be saved as Tpngimage. Or maybe I misunderstood. The problem is that the picture graphic is not loaded at all in the dfm. If I inspect the dfm in Delphi IDE it does not have the line Glyphs.Glyph.Data = { at all (glyphs,glyph is the Tpicture.). If I inspect with with Notepad I see Glyphs.Glyph.Data = { 0A54504E474F626A65637489504E470D0A1A0A0000000D494844520000004E00 00004E08060000008EAA201D000020CD4944415478DAED9C079414759EC7BFD5 69BA7B72C etc. However, if I do not save the dfm, at run time the image in Glyphs,Glyph is shown, although at design time is not present in the dfm. I am totally lost, I tried to remove all TpngObject reference from the project, but nothing changed. Can anyone help? How can I save the pngobject in the controls to the Vcl.Imaging.pngimage.TPngImage?
-
HI. Is accessing WMI thread safe? I mean this: I my Thread repeatedly list the print jobs in the sn spool with this code FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrintJob','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; etc. ...... Do I need to protect that with a criticalsection Acquire/Release? Thank you
- 4 replies
-
- criticasection
- wmi
-
(and 1 more)
Tagged with:
-
Thanks. It seems then I do not need to use a critical section because each thread instantiate the object and use the service.
- 4 replies
-
- criticasection
- wmi
-
(and 1 more)
Tagged with:
-
Yes, there other ways, but they do not work Anyway, in EACH thread I have a funtcion that does this FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', WbemUser, WbemPassword); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PrintJob','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; etc. ...... My question is: do i need to encapsulatwe it in a critical section Acquire/Release?. ( I am rather new to threads, but I would think it is not necessary)
- 4 replies
-
- criticasection
- wmi
-
(and 1 more)
Tagged with:
-
Hello. This is a hard one for me to understand/solve. Using synapse on delphi 11. I have a main form that starts a thread (TTCPHttpDaemon) defined in a used Unit; TTCPHttpDaemon.create; The initialization section of the the blcksock.pas of sinapse, runs at the very beginning of the App seems to successfully create the socket synsock.WSAStartup(WinsockLevel, WsaDataOnce); I create the thread (log_it() is a function to log messages). TTCPHttpDaemon.Create; TRY inherited create(false); sock:=TTCPBlockSocket.create; FreeOnTerminate:=true; except on E:SysUtils.Exception do begin log_it('TTCPHttpDaemon.Create '+e.message); end; end; end; No errors. Then right here i get the inexplicable behaviour procedure TTCPHttpDaemon.Execute; begin with sock do begin try CreateSocket; except on E:SysUtils.Exception do begin log_it(e.message); end; end; bind(serverip,PORTNUMBER); //portno listen; repeat try b:= canread (1000); RIGHT HERE!!!!! except on E:SysUtils.Exception do begin log_it('****** Canread error: '+e.message); end; end; if b then ClientSock:=sock.accept; ................... on the canread() function the error is 'winsock not initialized' code:10093 And the main form is destroyed, by-passing the except block. What goes wrong, where? This happened suddenly without any change to the App that I could tell. Could it be one of the lates windows 10 updates?
-
synapse and thread socket creation error 'winsock not initialized' 10093
alogrep replied to alogrep's topic in Algorithms, Data Structures and Class Design
Thanlks Remy. Ah! Fool that I am!. I caused the problem. It is true that the App had not changed at all when this started to happen. But the condition of the data that the app reads had changed in these last few occasions. In short, I have a check function that if the result is negative it goes Application.terminate. This a couple of lines before the Thread>create(); Obviously the app continued for a few microseconds and the thread was created BUT when it got to the Execute part the application was terminated and the socket was closed. I rewrote the lines if not checked then begin Application.terminate; exit; end; -
Hi I have an httpserver (synapse), which among other things print a short but rather complex . report. Therefore in the Execute part I have put a Critical section Acquire;/Release block (when rinting is required.) I cannot use a Printer:=Tprinter.create in the Execute block because the report creation and printing functions are used also by external EXE (and I cannot figure out to tell the function for the report to use th Printer created inside the thread or the vcl global Printer when it is called by gh external program). After I print a few times i get this error First chance exception at $75B98FC2. Exception class EAccessViolation with message 'Access violation at address 671A7B65 in module 'madExcept32.dll'. Read of address 8BF455D7'. Process Posserver.exe (2480) Is this an error of madexcept of of my program? And if it is from my program would anybody have an idea as ti what i am doing wrong and how to fix it? I hqve attached the log of the entire error message. log.txt
-
I do not do anything that requires user intervention inside the Thread. I guess you were misguided by the "PayForm_UNIT". I named it so for mnemonic reasons, but is a UNIT not a FORM. Anyway I guess I found the problem (I used a printer handle that was freed and not set to NIL).