|
the caracters are 1500011600190121KLM090034557908K0000000000000098 so these caracters are builded as barcode on different way in my application rather than on an application that I downloaded it as a demo that uses also IDAutomation(CODE 128).
Qendro
|
|
|
|
|
Hello all! It's now 8:10 am and I have been trying multiple solutions since 9:00 pm. I figured this would be a simple task and wow, have I been proven wrong.
First, I have been utilizing a print class (subclass) to handle my printing needs. I've been asked to have different font sizes utilized for the same page. Sounds simple...um, no. In VB6 I remember doing anything I wanted in printing! This is the only app I've had that required printing to a receipt printer or a laser printer.
I was sending multiple print calls to separate my font size parameters:
string text = "**ONLINE ORDER**\r\n\r\n" +
"Order Ready at:\r\n";
var printHead = new ReceiptPrint();
printHead.TextToPrint = text;
printHead.Print();
text = deliveryDate.ToShortDateString() + "\r\n" + deliveryTime.ToShortTimeString() + "\r\n";
var printDT = new ReceiptPrint();
printDT.PrinterFont = new Font("Arial", 20);
printDT.TextToPrint = text;
printDT.Print();
Unfortunately, this will print a separate page for each printer call. Is there anything I can research (specifically) to print text with varied font sizes on the same page? I know it has to be possible because apps print multiple font sizes, colors, etc. all the time. I do not want the print dialogue box to appear, this needs to print to direct to default printer.
Can anyone offer some insight or point me in the right direction, please?
James
|
|
|
|
|
What is RecieptPrint? I assume that is what you meant by sub-class?
I tend to use a class that inherits from PrintDocument, which overrides the OnPrintPage function. This function has an argument for PrintPageEventArgs which has a graphics class which you can draw on (basically the paper to be printed).
I can draw whatever I want on here, fonts in any size or colour etc, no problems.
I think your problem is your RecieptPrint class is too limited and needs expanding. How does it print the text?
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Thank you for your quick reply.
ReceiptPrint is my subclass that inherits from PrintDocument.
I can draw whatever I want also, the problem is I need to utilize the class in a way that I can send multiple strings with various font sizes, then print all of them.
When I have attempted this, it only prints in one font size.
Here is the class for you to peek at:
class ReceiptPrint : PrintDocument
{
#region Property Variables
private Font _font;
private string _text;
#endregion
#region Class Properties
public string TextToPrint
{
get { return _text; }
set { _text = value; }
}
public Font PrinterFont
{
get { return _font; }
set { _font = value; }
}
#endregion
#region Static Local Variables
static int curChar;
#endregion
#region Class Constructors
public ReceiptPrint() : base()
{
_text = string.Empty;
}
public ReceiptPrint(string str) : base()
{
_text = str;
}
#endregion
#region OnBeginPrint
protected override void OnBeginPrint(System.Drawing.Printing.PrintEventArgs e)
{
base.OnBeginPrint(e);
if (_font == null)
{
_font = new Font("Arial", 10);
}
}
#endregion
#region OnPrintPage
protected override void OnPrintPage(System.Drawing.Printing.PrintPageEventArgs e)
{
base.OnPrintPage(e);
int printHeight;
int printWidth;
int leftMargin;
int rightMargin;
Int32 lines;
Int32 chars;
{
printHeight = base.DefaultPageSettings.PaperSize.Height - base.DefaultPageSettings.Margins.Top - base.DefaultPageSettings.Margins.Bottom;
printWidth = base.DefaultPageSettings.PaperSize.Width - base.DefaultPageSettings.Margins.Left - 0;
leftMargin = base.DefaultPageSettings.Margins.Left = 0;
rightMargin = base.DefaultPageSettings.Margins.Top = 0;
}
if (base.DefaultPageSettings.Landscape)
{
int tmp;
tmp = printHeight;
printHeight = printWidth;
printWidth = tmp;
}
Int32 numLines = (int)printHeight / PrinterFont.Height;
RectangleF printArea = new RectangleF(leftMargin, rightMargin, printWidth, printHeight);
StringFormat format = new StringFormat(StringFormatFlags.LineLimit);
e.Graphics.MeasureString(_text, PrinterFont, new SizeF(printWidth, printHeight), format, out chars, out lines);
e.Graphics.DrawString(_text, PrinterFont, Brushes.Black, printArea, format);
curChar += chars;
e.HasMorePages = false;
}
#endregion
#region RemoveZeros
public int RemoveZeros(int value)
{
switch (value)
{
case 0:
return 1;
default:
return value;
}
}
#endregion
}
|
|
|
|
|
jameschristianii wrote: //Fit as many characters as we can into the print area
e.Graphics.MeasureString(_text, PrinterFont, new SizeF(printWidth, printHeight), format, out chars, out lines);
//Print the page
e.Graphics.DrawString(_text, PrinterFont, Brushes.Black, printArea, format);
This is where your restriction is. You need to change the printer font here depending on what you want to print. Your problem is you are only using one string of text, if you want different parts to be different font you need to break it up. Try having a collection property with a list of structs containing text and fonts, and print each as if it was a new line.
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
You're design is completely hosed up. You're printing a new page for every line of test your outputting. You can only call the Print method once per page, so you have to do all of your drawing before you call Print. So, you're PrintDocument class is going to need to know what the page looks like, every line, every image, so when Print is called, it can draw all of this stuff on the Graphics object that you get in the OnPrintPage event.
You basically need to implement some method of passing font, string, and drawing commands to your PrintDocument class. That class has to maintain a database of all of these commands. When the OnPrintPage event fires, your code has to go through all of these commands and execute them, one at a time, drawing each element of the page.
|
|
|
|
|
I was attempting to implement something to what you are saying. I didn't know the exact approach at doing that. I was trying to use a stringbuilder but my results were ineffective. I'm assuming I needs a means of implementing a flag for each string of text, correct?
Thank you.
|
|
|
|
|
Think of each string of text as an object that needs to be drawn on the page. Each object needs to supply certain things to your drawing engine. The first, obvisouly, is the text that needs to be drawn. You also need to know where on the page the text needs to be drawn and in what font, style, and size. In your OnPrintPage event handler, the code needs to enumerate the collection of these objects and draw each string at the position where it needs to be and with the correct font.
To use something like this, you'd probably do something like:
ReceiptPrint receipt = new ReceiptPrint();
receipt.AddDrawCommand(new TextDrawCommand("Some Store Header Text", "Arial", 16, FontStyle.Bold));
receipt.AddDrawCommand(new TextDrawCommand("Some Address Text", "Courier New", 10, FontStyle.Normal));
receipt.AddDrawCommand(new TextDrawCommand("------------------------", "Courier New", 10, FontStyle.Normal));
foreach(...)
receipt.AddDrawCommand(new TextDrawCommand(ItemText, "Arial", 10, FontStyle.Normal));
receipt.Print();
|
|
|
|
|
Ok, I understand what you are saying (It is similar to what I was trying to do earlier this morning), but I am unsure as to how I would go about the method you're suggesting. It was inside my class that I couldn't quite get the collection correct. I wasn't sure as to how I would set the object (string, font) and pass the object to the DrawString by looping through the collection.
|
|
|
|
|
Any one have a suggestion / idea / recommendation as to how (Or where I can research) a solution?
|
|
|
|
|
Can someone point me in a direction as to how to resolve this? I have been scouring the internet for hours trying too many things that aren't working completely.
Thank you,
James
|
|
|
|
|
I've Created one Desktop Application which has server client access... Every user will has different login. Now the problem is, when one user is login, the same user cannot be login from other pc... The msg should come as the 'user is already Login'. In ASP.Net, it can be achieved through session.. But, how can I do this in Desktop Application. There is one solution.. We can maintain one log table for the logined users. But, that too will face deadlock situation.... Is any other solution for the single user login??
|
|
|
|
|
Shalini_U wrote: I've Created one Desktop Application which has server client access
When you say server/client access, do you mean you have both a server app and a client app? if so, then the server app will easily be able to keep a list of logged in users and validate the login.
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Deadlock Situation may occur na?? ? Then, any user could not log in again
|
|
|
|
|
That depends on what you mean by "deadlock situation". I can't think of an issue that can't easily be resolved in a setup liek this.
|
|
|
|
|
When the server app validates login can it not check if existing user connection is still active?
Life goes very fast. Tomorrow, today is already yesterday.
|
|
|
|
|
Hi,
If anybody have an idea to upload quote data(in .CSV format) from c# application to Amibroker chart application.
|
|
|
|
|
Hello Ladies and Gentleman,
I have a problem with the DataTableColumn.AutoIncrementSeed value.
I am loading a set of Tables from my SQL Server DB to a DataSet by using SqlDataAdapter Fill method (I am using the MissingSchemaAction.AddWithKey property).
So I have a master detail scenario in my DataSet with 3 different tables, PrimaryKeys (all with autoincrement = true) and ForeignKeys.
The Problem is, when I insert new rows into the DataTables I want them to have ID's starting from -1 with an AutoIncrementStep = -1. The AutoIncrementStep is working fine.
Nevertheless I can not change the AutoIncrementSeed Even if I set its value to -1 (I checked in the debugger, the value is -1), after adding a new row, the seed starts at the last ID's value read from the DataBase while filling the DataTables. Am I missing something, or is this just impossible to change?
I would be really grateful for help.
Greets,
Arek
|
|
|
|
|
Hi,
To add auto increment column in the DataTable, we can set the AutoIncrement property of the DataColumn object as true and specify the seed value after adding that field into the DataTable object.
// create columns for the DataTable
DataTable dTable = new DataTable();
DataColumn auto = new DataColumn("AutoID", typeof(System.Int32));
dTable.Columns.Add(auto);
// specify it as auto increment field
auto.AutoIncrement = true;
auto.AutoIncrementSeed = 1;
auto.ReadOnly = true;
|
|
|
|
|
Hi S.Dhanasekaran
thank you for your reply, I really appreciate.
Why do I have to create a DataColumn by myself? When I use SQLDataAdapter Fill() method, it does the same for me.
After using the Fill method of the SQLDataAdapter I do sth like this:
dataS = new DataSet();
...
dataS.Tables.Add(dataTable);
dataS.Tables["MyTable"].Columns["MyID"].AutoIncrement = true;
dataS.Tables["MyTable"].Columns["MyID"].AutoIncrementStep = -1;
dataS.Tables["MyTable"].Columns["MyID"].AutoIncrementSeed = 0;
dataS.Tables["MyTable"].Columns["MyID"].AutoIncrement = true;
dataS.Tables["MyTable"].Columns["MyID"].ReadOnly = true;
When i check the debugger, the AutoIncrementSeed is "-1" and the AutoIncrementStep is also "-1".
But for example, when I have now 4 rows with MyIDs = {1, 2, 3, 4} and I add manually a new row to the DataSet, the value of MyID should be -1, but it is 3.
And I have completely no clue why is that
|
|
|
|
|
You cannot use negative numbers as the autoincrement value. Negative numbers are used by the DataAdpaters to add new records to the dataset that haven't been added to the backing database yet. The first new record you add will have an ID of -1, the next new record will be -2, and so on. Those are the temporary values used to uniquely identify each new record. They will get actual IDs once the changes are written to the database.
|
|
|
|
|
Hi Dave,
thanks for you reply.
Exactly that is what I want to achieve. I don't know the real ID values of the rows before I don't insert them to the Database. So in my case new DataTable rows are temporary and I want them to have negative ID (PrimaryKey) numbers. After I make an insert to the Database, they will receive the identity values from Database tables.
The step is negative and if I add enough rows it also gets negative, but it always starts from the last rows ID value, though I set the increment seed value to "0".
|
|
|
|
|
hi all,
what is the Difference between Button and Command button in .net
if anybody knows please reply me
Thanks in advance.
Raaj
|
|
|
|
|
Hi,
does this help you?
"The CommandButton control in Visual Basic 6.0 is replaced by the Windows Forms Button control in Visual Basic .NET"
It's from: link[^]
bye
|
|
|
|
|
|