|
Ok , the article that you are suggesting to use , is going to work with all kind of barcode readers , or only with those that are configured as Keyboards ?
|
|
|
|
|
The intended purpose of that article is to being able to know from which keyboard device a keypress came from. So it only works for barcode scanners with keyboard emulation. To my knowledge, that's probably all scanners in the price range up to $500 give or take. I haven't dealt with more expensive scanners yet.
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
|
He writes that the CodeProject article was his starting point. So it's mostly the same thing (Raw Input API); but I haven't read it all yet so I can't say if it's in some way better than the solution of the CP article or not.
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
bonjour à Tous,
sa fait longtemps que je cherche du code pour imprimer mon DataGridView complet avec visual basic 2010 express et j'ai testé tous les codes qu'ils s'affichent avec des recherches sur google mais en vain.
Mais finalement, j'ai trouver un code c# que j'ai converti en VB qui me convient parfaitement mais le seul problème c qu'il boucle infiniment ( boucle infini au niveau du nombre de pages )
NB: Le code ne génère aucune erreur
Voici mon code :
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Try
Dim iHeaderHeight As Double
Dim iLeftMargin As Integer = e.MarginBounds.Left
Dim iTopMargin As Integer = e.MarginBounds.Top
Dim bMorePagesToPrint As Boolean = False
Dim iTmpWidth As Integer = 0
If bFirstPage Then
For Each GridCol As DataGridViewColumn In DataGridView_impot.Columns
iTmpWidth = CType(Math.Floor(CType((CType(GridCol.Width, Double) / (CType(iTotalWidth, Double) * (CType(iTotalWidth, Double) * (CType(e.MarginBounds.Width, Double) / CType(iTotalWidth, Double))))), Double)), Integer)
iHeaderHeight = (CType(e.Graphics.MeasureString(GridCol.HeaderText, GridCol.InheritedStyle.Font, iTmpWidth).Height, Integer) + 11)
arrColumnLefts.Add(iLeftMargin)
arrColumnWidths.Add(iTmpWidth)
iLeftMargin = (iLeftMargin + iTmpWidth)
Next
End If
Dim iRow As Double
While (iRow <= (DataGridView_impot.Rows.Count - 1))
Dim GridRow As DataGridViewRow = DataGridView_impot.Rows(iRow)
iCellHeight = (GridRow.Height + 5)
Dim iCount As Integer = 0
If (iTopMargin + (iCellHeight >= (e.MarginBounds.Height + e.MarginBounds.Top))) Then
bNewPage = True
bFirstPage = False
bMorePagesToPrint = True
Exit While
Else
If bNewPage Then
e.Graphics.DrawString(Me.lbl_rs.Text, New Font(DataGridView_impot.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, (e.MarginBounds.Top - (e.Graphics.MeasureString(Me.lbl_rs.Text, New Font(DataGridView_impot.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13)))
e.Graphics.DrawString(Me.lbl_date_now.Text, New Font(DataGridView_impot.Font, FontStyle.Bold), Brushes.Black, (e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(Me.lbl_date_now.Text, New Font(DataGridView_impot.Font, FontStyle.Bold), e.MarginBounds.Width).Width)), (e.MarginBounds.Top - (e.Graphics.MeasureString(Me.lbl_rs.Text, New Font(New Font(DataGridView_impot.Font, FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13)))
iTopMargin = e.MarginBounds.Top
For Each GridCol As DataGridViewColumn In DataGridView_impot.Columns
e.Graphics.FillRectangle(New SolidBrush(Color.LightGray), New Rectangle(CType(arrColumnLefts(iCount), Integer), iTopMargin, CType(arrColumnWidths(iCount), Integer), iHeaderHeight))
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(CType(arrColumnLefts(iCount), Integer), iTopMargin, CType(arrColumnWidths(iCount), Integer), iHeaderHeight))
e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font, New SolidBrush(GridCol.InheritedStyle.ForeColor), New RectangleF(CType(arrColumnLefts(iCount), Integer), iTopMargin, CType(arrColumnWidths(iCount), Integer), iHeaderHeight), strFormat)
iCount = (iCount + 1)
Next
bNewPage = False
iTopMargin = (iTopMargin + iHeaderHeight)
End If
iCount = 0
For Each Cel As DataGridViewCell In GridRow.Cells
If (Not (Cel.Value) Is Nothing) Then
e.Graphics.DrawString(Cel.Value.ToString, Cel.InheritedStyle.Font, New SolidBrush(Cel.InheritedStyle.ForeColor), New RectangleF(CType(arrColumnLefts(iCount), Integer), CType(iTopMargin, Single), CType(arrColumnWidths(iCount), Integer), CType(iCellHeight, Single)), strFormat)
End If
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(CType(arrColumnLefts(iCount), Integer), iTopMargin, CType(arrColumnWidths(iCount), Integer), iCellHeight))
iCount = (iCount + 1)
Next
End If
iRow = (iRow + 1)
iTopMargin = (iTopMargin + iCellHeight)
End While
If bMorePagesToPrint Then
e.HasMorePages = True
Else
e.HasMorePages = False
End If
Catch exc As Exception
MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
|
|
|
|
|
This is an English-language site. Please edit your question and post it in English.
Ceci est un site de langue anglaise. S'il vous plaît modifier votre question et l'afficher en anglais.
(Google Translate[^])
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Good morning,
Thank you Rechard
i'm sorry, I didn't make attention to the used language
I will repost it in English
|
|
|
|
|
Hi Everyone, My xml looks like this, a single node with attributes.
<?xml version="1.0" encoding="utf-8"?>
<!--Project Time Tracking-->
<TimeTracking>
<Ticket Client="150-338" Code="Overview" Call="33685" Start_Time="1/12/2015 10:04:56 AM" Stop_Time="1/12/2015 2:09:04 PM" TimeNote="">04:04:08</Ticket>
<Ticket Client="602-501" Code="Post Go-Live Questions" Call="33480" Start_Time="1/13/2015 2:00:47 PM" Stop_Time="1/13/2015 2:30:48 PM" TimeNote="rate issues">00:30:01</Ticket>
<Ticket Client="150-315" Code="Post Go-Live Questions" Call="32641" Start_Time="1/13/2015 3:15:12 PM" Stop_Time="1/13/2015 4:45:12 PM" TimeNote="QualityOutsource issues">01:30:00</Ticket>
</TimeTracking>
My DataGridView is named Datagridview2 and is populated from a serious of different subs, below is an example:
Private Sub SelectedCode()
If Not String.IsNullOrEmpty(Me.cboTimeCode.Text) Then
DataGridView2.Columns.Clear()
DataGridView2.Rows.Clear()
Dim doc As New XmlDocument()
doc.Load("c:\myBSG\myBSGTimeclock.xml")
Dim nodeList As XmlNodeList
Dim node As XmlNode = Nothing
Dim selCode As String = Me.cboTimeCode.SelectedItem
nodeList = doc.SelectNodes(".//TimeTracking/Ticket[@Code='" & selCode & "']")
DataGridView2.Columns.Add("Client", "Client")
DataGridView2.Columns.Add("Call", "Call")
DataGridView2.Columns.Add("Code", "Code")
DataGridView2.Columns.Add("TimeNote", "TimeNote")
DataGridView2.Columns.Add("Start_Time", "Start")
DataGridView2.Columns.Add("Stop_Time", "End")
DataGridView2.Columns.Add("Duration", "Duration")
For Each node In nodeList
If InDateRange(node.Attributes("Start_Time").InnerText) = True Then
DataGridView2.Rows.Add(node.Attributes("Client").InnerText, node.Attributes("Call").InnerText, node.Attributes("Code").InnerText, node.Attributes("TimeNote").InnerText, node.Attributes("Start_Time").InnerText, node.Attributes("Stop_Time").InnerText, node.InnerText)
End If
Next
DataGridView2.Sort(DataGridView2.Columns(4), System.ComponentModel.ListSortDirection.Descending)
end sub
Now In my grid I have editmode set to EditonKeystrokeorF2 and am wanting to edit one or more cells in a "row" and using CellEndEdit, save the edited cell (or entire row) I cannot find any samples to help me with the save code.. I was thinking it would be something easy like WriteXML but that doesnt work
Any help or direction you could offer would be great. I am thinking that my problem might be that I am using nodes with multiple attributes rather that nodes with separate elements, but my lingo and thought process may be way off.
Thanks
modified 25-Jan-16 10:00am.
|
|
|
|
|
Hi,
I'm trying to set the Primary Display...without success!
Here's the code I'm working on, would you please help me see what I'm doing wrong there?
There's no compilation error...it simply doesn't give the expected result!
Thank you!!
Imports System.Runtime.InteropServices
Class MainWindow
Const CCDEVICENAME As Short = 32
Const CCFORMNAME As Short = 32
Private Const MONITORINFOF_PRIMARY As Integer = &H1
Private Const DISPLAY_DEVICE_ATTACHED_TO_DESKTOP As Integer = &H1
Private Const DISPLAY_DEVICE_PRIMARY_DEVICE As Integer = &H4
Private Const DISPLAY_DEVICE_MIRRORING_DRIVER As Integer = &H8
Private Const DISPLAY_DEVICE_VGA_COMPATIBLE As Integer = &H10
Private Const DISPLAY_DEVICE_
Private Const DISPLAY_DEVICE_MODESPRUNED As Integer = &H8000000
Private Const DM_POSITION = &H20
Private Const DM_DISPLAYORIENTATION = &H80
Private Const DM_BITSPERPEL = &H40000
Private Const DM_PELSWIDTH = &H80000
Private Const DM_PELSHEIGHT = &H100000
Private Const DM_DISPLAYFLAGS = &H200000
Private Const DM_DISPLAYFREQUENCY = &H400000
Private Const ENUM_CURRENT_SETTINGS As Integer = -1
Private Const ENUM_REGISTRY_SETTINGS As Integer = -2
Private Const EDS_RAWMODE As Integer = &H2
Private Const CDS_UPDATEREGISTRY As Integer = &H1
Private Const CDS_TEST As Integer = &H2
Private Const CDS_FULLSCREEN As Integer = &H4
Private Const CDS_GLOBAL As Integer = &H8
Private Const CDS_SET_PRIMARY As Integer = &H10
Private Const CDS_VIDEOPARAMETERS As Integer = &H20
Private Const CDS_NORESET As Integer = &H10000000
Private Const CDS_RESET As Integer = &H40000000
Private Const CDS_FORCE As Integer = &H80000000
Private Const CDS_NONE As Integer = 0
Public Structure PointL
Dim x As Integer
Dim y As Integer
End Structure
<Flags()> _
Enum DisplayDeviceStateFlags As Integer
AttachedToDesktop = &H1
MultiDriver = &H2
PrimaryDevice = &H4
MirroringDriver = &H8
VGACompatible = &H10
Removable = &H20
ModesPruned = &H8000000
Remote = &H4000000
Disconnect = &H2000000
End Enum
Const DISPLAY_PRIMARY_DEVICE = &H4
Private Structure DISPLAY_DEVICE
Public cb As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> Public DeviceName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceString As String
Public StateFlags As Short
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceID As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public DeviceKey As String
End Structure
Private Structure DEVMODE
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> _
Public dmDeviceName As String
Public dmSpecVersion As Short
Public dmDriverVersion As Short
Public dmSize As Short
Public dmDriverExtra As Short
Public dmFields As Integer
Public dmOrientation As Short
Public dmPositionX As Integer
Public dmPositionY As Integer
Public dmCopies As Short
Public dmDefaultSource As Short
Public dmPrintQuality As Short
Public dmColor As Short
Public dmDuplex As Short
Public dmYResolution As Short
Public dmTTOption As Short
Public dmCollate As Short
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> _
Public dmFormName As String
Public dmLogPixels As Short
Public dmBitsPerPel As Short
Public dmPelsWidth As Integer
Public dmPelsHeight As Integer
Public dmDisplayFlags As Integer
Public dmDisplayFrequency As Integer
Public dmICMMethod As Integer
Public dmICMIntent As Integer
Public dmMediaType As Integer
Public dmDitherType As Integer
Public dmReserved1 As Integer
Public dmReserved2 As Integer
Public dmPanningWidth As Integer
Public dmPanningHeight As Integer
End Structure
<DllImport("user32.dll")> _
Private Shared Function EnumDisplayDevices(ByVal Unused As Integer, _
ByVal iDevNum As Short, ByRef lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Integer) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function EnumDisplaySettings(ByVal lpszDeviceName As String, _
ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String, _
ByRef lpDevMode As DEVMODE, ByVal hWnd As Integer, ByVal dwFlags As Integer, _
ByVal lParam As Integer) As Integer
End Function
<DllImport("user32.dll")> _
Private Shared Function ChangeDisplaySettingsEx(ByVal lpszDeviceName As String, _
ByRef lpDevMode As IntPtr, ByVal hWnd As Integer, ByVal dwFlags As Integer, _
ByVal lParam As Integer) As Integer
End Function
Public Sub SetAsPrimaryMonitor(id As UInteger)
Dim device = New DISPLAY_DEVICE()
Dim deviceMode = New DEVMODE()
device.cb = Marshal.SizeOf(device)
EnumDisplayDevices(Nothing, id, device, 0)
EnumDisplaySettings(device.DeviceName, -1, deviceMode)
Dim offsetx = deviceMode.dmPositionX
Dim offsety = deviceMode.dmPositionY
deviceMode.dmPositionX = 0
deviceMode.dmPositionY = 0
ChangeDisplaySettingsEx(device.DeviceName, deviceMode, 0, (CDS_SET_PRIMARY Or CDS_UPDATEREGISTRY Or CDS_NORESET), 0)
device = New DISPLAY_DEVICE()
device.cb = Marshal.SizeOf(device)
Dim otherid As UInteger = 0
While EnumDisplayDevices(Nothing, otherid, device, 0)
If device.StateFlags = DisplayDeviceStateFlags.AttachedToDesktop AndAlso otherid <> id Then
device.cb = Marshal.SizeOf(device)
Dim otherDeviceMode = New DEVMODE()
EnumDisplaySettings(device.DeviceName, -1, otherDeviceMode)
otherDeviceMode.dmPositionX -= offsetx
otherDeviceMode.dmPositionY -= offsety
ChangeDisplaySettingsEx(device.DeviceName, otherDeviceMode, 0, (CDS_UPDATEREGISTRY Or CDS_NORESET), 0)
End If
device.cb = Marshal.SizeOf(device)
otherid += 1
End While
ChangeDisplaySettingsEx(Nothing, 0, 0, CDS_NONE, 0)
End Sub
Private Sub Button1_Click_1(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
SetAsPrimaryMonitor(0)
End Sub
End Class
modified 19-Jan-16 5:55am.
|
|
|
|
|
Well did you step through it in the debugger and check the return values from the functions that do the work?
You need to narrow it down to exactly which function call is not working as intended.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
It returns a 0 (DISP_CHANGE_SUCCESSFUL) !!
|
|
|
|
|
|
So I'm working on my Windows Service that sends email, in which I can read and write the parameters needed for it to communicate now.
I rewrote the service from scratch, and made 3 thread classes.
So the service runs Thread1 to test for communications and file I/O success.
Next Thread2 runs and check for jobs, if there are no jobs, it just sleeps for 15 minutes and checks again.
Finally, the jobs must be sent by Thread3 or the Await Task.
I've never done this before, this is my first time, and I want to get it right.
I did read an article about race conditions, so I can avoid that, and the principles of Threading
http://visualbasic.about.com/od/usingvbnet/a/threadingintro.htm[^]
Thread1 - Test for Communications, Sort of a systems check, Service Stops on failure.
Thread2 - Check for Jobs, if jobs exist, send email
Thread3 - Send Email
Await Task - Send Email
Now if there are jobs, I load the job and run it.
Question:
Is is stupid to load Thread3 to send the job from Thread2? Another Thread called from a Thread.
I did figure out how to stop the threads on shutdown or power down, and sleep. But I'm not sure what the best design would be.
Or should I just use Thread2 to load an Await Task, and have Thread2 monitor the progress, and wait for the Task to complete. Then Thread2 can load the next job if it exist and repeat the process again.
[Edit]
Now I have another question:
I have this thread base code that seemed pretty practical, used an online example.
I placed my job checking code in RunScheduler, and was going to place code to send the emails in StartWorkerThread. I don't get the RunPayLoad. What is Payload Code?
Public Class serviceThread_Jobs_BaseCode
Public Shared ServiceThread As Thread
Public Shared ThreadRunning As Boolean = True
Public Shared KeepRunning As Boolean = True
Private Shared PollingInterval As Integer = My.Settings.PollingInterval
Private Shared ActionInterval As Integer = My.Settings.ActionInterval
Public Shared Sub Thread_Start()
ServiceThread = New Thread(AddressOf RunScheduler)
ServiceThread.Name = "serviceThread_Jobs_BaseCode"
ServiceThread.Start()
KeepRunning = True
custom_eventLog.WriteToEventLog("serviceThread_Jobs_BaseCode - Thread_Start() has been called", 7100, EventLogEntryType.Information)
End Sub
Public Shared Sub Thread_Stop()
KeepRunning = False
custom_eventLog.WriteToEventLog(
"serviceThread_Jobs_BaseCode is stopping. " & vbCrLf & _
"Please note: the worker process will live on for up to " & _
PollingInterval / 1000 & " seconds before it terminates.",
7100
)
End Sub
Private Shared Sub RunPayload(ByVal objInput As Object)
' Write your service payload code and/or function calls here. For example:
Try
custom_eventLog.WriteToEventLog("serviceThread_Jobs_BaseCode - payload execution: " & objInput, 7100)
Catch e As Exception
custom_eventLog.WriteToEventLog("serviceThread_Jobs_BaseCode - payload execution error: " & e.Message & vbCrLf, 7200)
End Try
End Sub
Private Shared Sub RunScheduler()
Dim LastActionTime As Date = DateAdd(DateInterval.Day, -1, Date.Now)
Do While KeepRunning
If DateDiff(DateInterval.Second, LastActionTime, Date.Now) >= ActionInterval Then
LastActionTime = Date.Now
'check for posted jobs
StartWorkerThread()
End If
Thread.Sleep(PollingInterval)
Loop
End Sub
Private Shared Sub StartWorkerThread()
'Check for the Thread Stop Command and Stop Running
If (True = KeepRunning) Then
Dim WorkerThread As Thread = New Thread(AddressOf RunPayload)
' A parameter value can be transferred to the payload function via Start():
WorkerThread.Start("Hello world " & Date.Now.ToString("yyyy-MM-dd HH:mm:ss"))
Else
ThreadRunning = False
End If
End Sub
End Class
modified 14-Jan-16 14:09pm.
|
|
|
|
|
From your description it's not obvious to me why you need parallelism at all. Couldn't you just make do with a single thread that completes these steps in sequence?
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
The 2nd version I wrote does it in a single task in my Windows Form App using await.
And the first version I wrote of this Windows Service does it using Main()
But the Code looked sort of sloppy and relied too heavily on timers, so I thought I'd try something different.
I guess I just wanted to learn how to use threads, and wanted to implement it in this program.
modified 14-Jan-16 14:38pm.
|
|
|
|
|
That code is using a whole thread just for the purpose of starting another thread at regular intervals and otherwise sleeping. That's awful. You could basically replace it with the code sample from the Timer Class (System.Threading)[^].
If you got a working code without threading I would use that. If it looks sloppy (like you said) I would suggest trying to improve it without introducing unnecessary parallelism. If you want to do something with Tasks/Threads in order to learn about it I would try to find some project that actually calls for it.
And I would suggest using Tasks instead of Threads: Tasks can do the same thing but better/in a more convenient way in 99% of all cases. Take a look at Sacha Barber's articles on the TPL if you haven't already: Task Parallel Library: 1 of n[^]
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
I'm starting to get it now. Advice taken
|
|
|
|
|
Assuming you're sending out a (fairly) large number of emails (if not, why bother with this at all?) I think you'd do better to, as others have suggested, write it in a single thread, but then use multi-threading for the actual sending - you can send out multiple emails faster by, for example, looping through your mails and sending each out via one of, say, three threads in turn.
|
|
|
|
|
I went back to the single thread yesterday, and converted my threads to Await or Async. The part that sends the email is threaded already, using Thread and ThreadStart. I mange to run one test yesterday, and so far so good, it worked. Just need to plug in the sending part and test again.
Right now, the subscriber list has about 4000 people, so with a 5 second pause, it doesn't take long to send the list, about 4 hours. And they all go to the same mailserver for sending.
Well for what its worth, at least I have some experience with it, and will be ready if that day ever comes.
I'll probably be back for the stop question, if the cancellation token doesn't work for shutting down the service, and I need to figure how how to save the position of the subscriber list, to pick up where it left off.
But Thanks for the real work view for the proper design aspect!
|
|
|
|
|
Yup - nothing like learning the hard way!
Do you really need a 5 second pause between mails? Maybe it depends on your mail server/service, but it shouldn't really be necessary. I've sent to lists of c 4,000 in a fraction of the time yours are taking - talking minutes, not hours - using 3 threads in the sending routine.
|
|
|
|
|
The idea behind that was to allow time for other things;
Be nice to the mail server at the customers ISP, instead of bombarding it, just do a slow feed.
Allow time for people using the website to squeeze in a page request.
I was thinking of that Russian search engine Yandex that just goes full force on my web servers, and didn't want to be like that.
I just reread this, your using 3 threads?
I do compress the HTML before sending to make a smaller package.
|
|
|
|
|
Well, you have a different model from me; in my case, I'm hosting the client websites, and my mail program runs as an exe in the background regularly polling their databases to see if they've initiated a mailout. When it finds one, it cycles through their mailing-list/s and sends out their newsletter, using a 3-threaded routine. The emails are sent using a third-party email relay service - my exe simply creates the mail messages and fires them off using this relay service. It's very quick, and doesn't impact on the sites' performance in any noticeable way.
|
|
|
|
|
The email relay sounds like a good idea. I should look into that. I wanted to do the Thread gig so later, I could expand it to pushing out emails faster.
This is for an eCommerce site that I wrote from scratch. All the other emails such as order confirmation and your order has shipped gets called by the main thread, and the worker thread loads the HTML Template, changes the field values, and sends it off. The HTML Template is a HTML Document in the App_Data the operator can change to their liking, so it's not hard coded.
Here's the story:
This post is for the Email Advertising Campaign. i originally wrote it as a web app on the back end of my eCommerce program. But when I upgraded my code to Entity Framework, I could not figure out how to talk to the database. So for Black Friday, I had to write Windows Desktop App really fast to send out the emails. That was my first sales campaign, which produced a ton of sales that weekend.
Then I expanded my program, for another sale, and another, more revenue came in. So I added more programs to match what I had on the back end of my web app. So now you can generate HTML templates to send, publish them, create jobs, send jobs by date, book jobs into the future. It's sort of a Swiss knife Windows Desktop App that does it all.
Then I decided to add the Windows Service that I broke back into the program to send in the background, and eventually put it back into my website to run on the server. So this new windows service kicked my butt in terms of design and security permissions. But I figured out how to make a web service on the website to use for data, and write binary serialization classes to the disk drive with permission for the Windows App and the Windows Service. Thought the treads would be the icing on the cake.
So Today
I'm sending emails now using the web service. Now I just need to write a binary file to the disk drive to store the current position of the job, in case the power goes out, or the computer / server is turned off so the service can resume it's duties. And a Task Bar program.
Your program sounds really cool, and I like the design.
I'm curious, what do you think of this Swiss Knife Windows App that I wrote about?
Think it's a waste of time?
Would you be interested in looking at the instruction manual for it?
The intent was to move the website back end to a windows app, and convert the back end into a simple mobile design for small task from the phone. Experiment with being able to do this without tunneling to the database server or punching holes in the firewall.
|
|
|
|
|
If it works for you, it's good! The only bad program is one that doesn't do the job. And pitifully few programs are (able to be) fully thought and mapped out in advance - the usual story is, as in yours, that we're flying by the seat of our pants doing what we can in the limited amount of time our bosses or clients give us, and having to accommodate their ever-changing requirements into the bargain.
I'll bear your offer in mind, but I really haven't got time right now to devote to looking at it - on top of two or three other non-trivial projects I've just had a whopper land on my desk which I need to get to grips with fast, which means getting my head around writing cross-platform "open" mobile apps - see my post in that forum if you're interested!
|
|
|
|
|
Time!, this stuff is so time consuming to write.
I'll take that as positive feedback, and what ever it takes to make the job easier for the users.
I have to wrap this up today because too much time has been spent on it.
|
|
|
|
|