Starting from scratch.....bummer!

pachjo

Well-known member
Joined
Dec 12, 2006
Messages
370
Programming Experience
10+
Ok from my other posts you will see I have thanks to SAMS taught myself how to code VB.NET - SQL Express the old way and am now trying to learn the new way.

To this end I have done the following and am confused to boot....

Created a new database with a single table
Created a new datasource to this database
Created a textbox on the form
Created a button on the form
Created a combobox on the form
Added a bindingsource to the form
Set the combobox to use the bindingsource

The combobox allows me to erase contents in display but does not alter list
The combobox displays the table content in order

I want to be able to insert a new record and thus see it in the combobox.
I understand that once a row is inserted to the table the combobox will update automatically

Problem is.....I cant see how to insert a new row?

I have tried something along these lines but get an error detailed below:

VB.NET:
Expand Collapse Copy
[SIZE=2][COLOR=#0000ff]Private[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][SIZE=2] btnAdd_Click([/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] sender [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] System.Object, [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] e [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] System.EventArgs) [/SIZE][SIZE=2][COLOR=#0000ff]Handles[/COLOR][/SIZE][SIZE=2] btnAdd.Click[/SIZE]
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] rbRowBuilder [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] System.Data.DataRowBuilder[/SIZE]
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] rwNewRow [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] NewDataAccessDataSet.tranaction_descriptionsRow(rbRowBuilder)[/SIZE]
[SIZE=2]rwNewRow.Item(1) = [/SIZE][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][SIZE=2].txtNewDescription.Text[/SIZE]
[SIZE=2]rwNewRow.Item(2) = [/SIZE][SIZE=2][COLOR=#a31515]"FALSE"[/COLOR][/SIZE]
[SIZE=2]rwNewRow.Item(3) = [/SIZE][SIZE=2][COLOR=#a31515]"FALSE"[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][SIZE=2].BindingSource1.Add(rwNewRow)[/SIZE]
[SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE]


Where I try to create the new rwNewRow the parameter rbRowBuilder errors as not set to object.

I expect this, but the line to create the rowbuilder errors when I try to use New as it says it does not have a consturctor.

Also......all in all am I almost on track or still completely wrong in trying this way of doing things?

Thanks
 
Now this works...

VB.NET:
Expand Collapse Copy
[SIZE=2][COLOR=#0000ff]Private[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][SIZE=2] btnAdd_Click([/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] sender [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] System.Object, [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] e [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] System.EventArgs) [/SIZE][SIZE=2][COLOR=#0000ff]Handles[/COLOR][/SIZE][SIZE=2] btnAdd.Click[/SIZE]
 
[SIZE=2][COLOR=#0000ff]  Dim[/COLOR][/SIZE][SIZE=2] rwNewRow [/SIZE][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][SIZE=2] NewDataAccessDataSet.tranaction_descriptionsRow[/SIZE]
[SIZE=2]  rwNewRow = NewDataAccessDataSet.tranaction_descriptions.NewRow[/SIZE]
[SIZE=2]  rwNewRow.Item(1) = [/SIZE][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][SIZE=2].txtNewDescription.Text[/SIZE]
[SIZE=2]  rwNewRow.Item(2) = [/SIZE][SIZE=2][COLOR=#a31515]"FALSE"[/COLOR][/SIZE]
[SIZE=2]  rwNewRow.Item(3) = [/SIZE][SIZE=2][COLOR=#a31515]"FALSE"[/COLOR][/SIZE]
[SIZE=2]  NewDataAccessDataSet.tranaction_descriptions.Rows.Add(rwNewRow)[/SIZE]
[SIZE=2][COLOR=#0000ff]  Me[/COLOR][/SIZE][SIZE=2].Tranaction_descriptionsTableAdapter.Update([/SIZE][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][SIZE=2].NewDataAccessDataSet.tranaction_descriptions)[/SIZE]
[SIZE=2][COLOR=#0000ff]  Me[/COLOR][/SIZE][SIZE=2].txtNewDescription.Text = [/SIZE][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][SIZE=2].Empty[/SIZE]
[SIZE=2][COLOR=#0000ff][/COLOR][/SIZE] 
[SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE]

But is it the correct 'new' way to do it?
 
OK, imho, that code is a bit messy and hard to read, so I'll try do 2 things:
1) comment it so you knwo what bits do what

2) correct the bits i think are messy

'comments on corrections appear normal
'comments on what the code is doing appear italic

VB.NET:
Expand Collapse Copy
'ditch hungarian for controls. use the format: nameType
'subs and functions start with upper case: AddButton_Click
'variable names start with lower case: addButton
Private Sub [B]AddButton[/B]_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles [B]addButton[/B].Click
 
  'its only a temp row, give it a nice simple name. ditch hungarian
  'call your dataset something nicer
  'call your datatable something nicer, dont mix word separation notions: UseThisNotion or_use_this_notion
  [I]'declare a variable of type suitable to hold a custom-typed datarow[/I]
  Dim [B]ro[/B] As [B]TestDataSet[/B].TransactionDescriptionsRow
 
  'ask the table to build a new row for you
  'note that TestDataSet is our TYPE, testDataSet is our object instance
  [I]'assign ro = the return of the NewTransactionDescriptionsRow method of[/I]
[I] ' the TransactionDescriptions datatable (a property) of testDataSet[/I]
  ro = [B]testDataSet[/B].TransactionDescriptions.[B]NewTransactionDescriptionsRow[/B]()
 
  'this datatable is TYPED, dont use it in untyped fashion! 
  'Ive assumed Item(1) refers to a column called Description
  'hungarian prefix removed, textbox renamed
  [I]'set the Description property (it maps to a column value) of this row to text[/I]
  ro[B].Description[/B] = [B]NewDescriptionTextBox[/B].Text
 
  'ideally you would created your database columns to have a boolean type
  'rather than storing a 5 char string (10 bytes for 1 bit?!!)
  'hence your data columns on the client would have boolean types
  '[I]again, just set some values on this row. Using names = we dont ahve to[/I]
[I] 'remember numbers. Also when GETting rather than SETting, row.Item() gives[/I]
[I] 'an OBJECT whereas these give the direct subtype (no casting needed)[/I]
  ro.[B]MyBooleanOne[/B] = False
  ro.[B]MyBooleanTwo[/B] = False
 
  'here i use AddXXXRow, rather than Rows.Add. Rows.Add accepts any kind of 
  'datarow, potentially dangerous habit to get into. Use type specific subs and funcs
  'wherever possible
 [I] 'put the new row in the table [/I]
  testDataSet.TransactionDescriptions.[B]AddTransActionDescriptionsRow[/B](ro)
 
  'corrected naming convention of tableadapter. 
  'use of Me isnt necessary
  [I]'update() causes changes to be sent back to database. are you sure you want this?[/I]
  [B]TransactionDescriptionsTableAdapter[/B].Update(testDataSet.TransactionDescriptions)
 
I have, additionally, used this way before now, and it works better for some things:

VB.NET:
Expand Collapse Copy
Dim dt as Dim [B]TestDataSet[/B].TransactionDescriptionsDataTable = t[B]estDataSet[/B].TransactionDescriptions
 
dt.DescriptionColumn.DefaultValue = descTextBox.Text
 
'if these are sensible defaults and dont change, set them in the
'dataset designer instead
dt.MyBoolColOne.DefaultValue = false
dt.MyBoolColTwo.DefaultValue = false
 
'addnew adds a new row to internal BS list, with default values
TransactionDescriptionsBindingSource.AddNew()
 
'endedit commits new row into underlying datatable.
TransactionDescriptionsBindingSource.EndEdit()
 
'send changes to db
TransactionDescriptionsTableAdapter.Update(dt)

It depends what you want.. This method causes any bound controls (boudn to this BS) to show the new row immediately; BS.AddNew() necessarily changes the BS.Position to point at the new row

It can also work better with related data, but lets walk before we run
 
Mmmm you really have confused the heck out of me now:confused:

So are you saing both of my blocks above are messy?

I thought block 2, the one that works looked fine and way better than the old way I did it and I was really chuffed I had got it to work:(

I need to read you comments over and over as it is loosing me!

I have always called variables to reflect where they are being used. I appreciate what you say that it is only a row, but to me:

rwNewRow means more to me me at first glance than ro.

I guess it is personal preference, engrained in me since the very early 90's

Also you mention a difference between TestDataSet and testdataset?

This does confuse the hell out of me having two things named the same differeing only by case?

One question I was going to ask was that on my form I have a dataset, a bindingsource and a tableadapter.

As you can see I have managed to link them all together to populte and update a combobox.

I have created another query on this single dataset called fillvoid to return rows that are flagged as void.

But I cannot see how I bind this to the void combobox.

Do I need a second binding source and somehow call .fillvoid rther than .fill?


lastly, I can sort of see the benefit of doping it this way. It certainly was far easier to setup than the way I originally did it.

Also if I am grasping this correctly the app wont need much tweaking to take the new coding style
 
This is the code for the buttons that successfully update new entries the user can make into the transaction_description table:

VB.NET:
Expand Collapse Copy
   Private Sub btnSaveDescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnSaveDescription1.Click, btnSaveDescription2.Click

        ' new row for the transacation description table

        Dim rwNewRow As MM2007DataSet.transaction_descriptionsRow

        ' textbox object make this proc generic

        Dim txtTextBox As New TextBox

        ' get currently selected tabpage

        Dim intSelectedTabPage As Integer = Me.tbcMain.SelectedIndex

        ' reference the calling textbox

        txtTextBox = DirectCast(Me.tbcMain.SelectedTab.Controls("panel" & intSelectedTabPage & 0).Controls("txtNewTransactionDescription" & intSelectedTabPage), TextBox)

          Try

            ' if the entry is already in the table....bomb

            If Not MM2007DataSet.transaction_descriptions.Rows.Find(txtTextBox.Text) Is Nothing Then

                MessageBox.Show("The transaction description " & txtTextBox.Text & " already exists", _
                                "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                Exit Sub

            End If

            ' create a new row with the schema from the transaction description table

            ' BUT WHY DO I HAVE TO USE CType WHEN i DECLARED THE VARIABLE TO BE CORRECT TYPE?

            rwNewRow = CType(MM2007DataSet.transaction_descriptions.NewRow, MoneyMatters.MM2007DataSet.transaction_descriptionsRow)

            ' set the values 

            rwNewRow.Item(1) = txtTextBox.Text
            rwNewRow.Item(2) = "FALSE"
            rwNewRow.Item(3) = "FALSE"

            ' add the row into the table within the dataset

            MM2007DataSet.transaction_descriptions.Rows.Add(rwNewRow)

            ' write the changes back to the database
            Me.Transaction_descriptionsTableAdapter.Update(MM2007DataSet.transaction_descriptions)

            ' reset comboboxes to first entry, remember set 1 set all

            Me.cboTransDescription1.SelectedIndex = 0

            ' clear the user input field and set focus

            txtTextBox.Clear()

            txtTextBox.Select()

        Catch objError As Exception

            MessageBox.Show("Location: btnSaveDescription_Click" & System.Environment.NewLine & System.Environment.NewLine & "The following error occurred whilst saving the description changes" & _
                          System.Environment.NewLine & System.Environment.NewLine & objError.Message & System.Environment.NewLine & System.Environment.NewLine & "If the problem persists contact support@........", _
                          "Save Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub

this works a treat and I thought was much better, so do you really think this is naff?

:(
 
OK here is the latest offering:

VB.NET:
Expand Collapse Copy
Private Sub btnSaveDescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveDescription1.Click

        ' new row for the transacation description table

        Dim rwNewRow As MM2007DataSet.transaction_descriptionsRow

        ' textbox and combobox objects make this proc generic

        Dim txtTextBox As New TextBox

        ' get currently selected tabpage

        Dim intSelectedTabPage As Integer = Me.tbcMain.SelectedIndex

        ' reference the calling textbox

        txtTextBox = DirectCast(Me.tbcMain.SelectedTab.Controls("panel" & intSelectedTabPage & 0).Controls("txtNewTransactionDescription" & intSelectedTabPage), TextBox)

        Try

            ' if the entry is already in the table....bomb

            If Not MM2007DataSet.transaction_descriptions.Rows.Find(txtTextBox.Text) Is Nothing Then

                MessageBox.Show("The transaction description " & txtTextBox.Text & " already exists", _
                                "Duplicate Entry", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                Exit Sub

            End If

            ' create a new row with the schema from the transaction description table

            rwNewRow = MM2007DataSet.transaction_descriptions.Newtransaction_descriptionsRow

            ' set the values 

            rwNewRow.tran_description = txtTextBox.Text
            rwNewRow.void = False
            rwNewRow.auto_tran = False

            ' add the row into the table within the dataset

            MM2007DataSet.transaction_descriptions.Rows.Add(rwNewRow)

            ' write the changes back to the database

            Me.Transaction_descriptionsTableAdapter.Update(MM2007DataSet.transaction_descriptions)

            ' reset comboboxes to first entry, remember set 1 set all

            Me.cboTransDescription1.SelectedIndex = 0

            ' clear the user input field and set focus

            txtTextBox.Clear()

            txtTextBox.Select()

        Catch objError As Exception

            MessageBox.Show("Location: btnSaveDescription_Click" & System.Environment.NewLine & System.Environment.NewLine & "The following error occurred whilst saving the description changes" & _
                          System.Environment.NewLine & System.Environment.NewLine & objError.Message & System.Environment.NewLine & System.Environment.NewLine & "If the problem persists contact support@........", _
                          "Save Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

    End Sub

So this is better yes?

Also re the naming convention...I am the only one, that handles my code, apart from posting here of course so the convention I use....from the old days suits me better.

Take this example:

txtNewTransactionDescription

or

newtransactiondescriptionButton

I think the first one is easier to read and understand? You see at once txt means it is a textbox and the camel casing makes the reading of each word eaier on the eye.
 
Mmmm you really have confused the heck out of me now:confused:

So are you saing both of my blocks above are messy?
To me, yes. The mix upper and lower case and spurious use of underscores, hungarian notation and overly-wordy variable names

I thought block 2, the one that works looked fine and way better than the old way I did it and I was really chuffed I had got it to work:(
Just because it's a mess doesnt mean you cant be proud, but making your code clean is something that you will come to appreciate with experience.. For years, your mum yelled at you to clean your bedroom, but you never did. Then, when you get older and have kids, youre the tidy one and you yell at them.. Its "The Way It Is" :)


I have always called variables to reflect where they are being used. I appreciate what you say that it is only a row, but to me:

rwNewRow means more to me me at first glance than ro.
Yes, but "ro" is in use for about 3 lines!! There is no point in saying:

VB.NET:
Expand Collapse Copy
Dim drMyNewRowThatIAmGoingToAddIntoTheXYZTable as XYZDataSet.XYZDataRow
drMyNewRowThatIAmGoingToAddIntoTheXYZTable = ...
drMyNewRowThatIAmGoingToAddIntoTheXYZTable . ...
drMyNewRowThatIAmGoingToAddIntoTheXYZTable . ...
I'm being extreme here, but really, giving temporary variables long, descriptive names when they will only be used over a few (<10) lines of code is just creating clutter...

I guess it is personal preference, engrained in me since the very early 90's
Uhuh, and old things need to be thrown out once in a while.. The very early '90s[sic] were days of the 80286, 640kb of memory and maybe Windows 3 ;)

Also you mention a difference between TestDataSet and testdataset?

This does confuse the hell out of me having two things named the same differeing only by case?
They arent the same thing. They are very, very different things:

TestDataSet is a TYPE, just like String, Integer, Object
testDataSet is an instance of an object

Dim testDataSet as TestDataSet = New TestDataSet

if it makes it clearer:

Dim testDataSetInstance as TestDataSet = New TestDataSet

.NET best practices recommend instances start with a lowercase and types start with uppercase. VB.NET is particularly bad at following this, which is something of a blight to its programmers.

If youre struggling with the difference between a type and an object instance, you should look to a tutorial on OO basic principles..

One question I was going to ask was that on my form I have a dataset, a bindingsource and a tableadapter.

As you can see I have managed to link them all together to populte and update a combobox.
Read carefully my comment on the use of Update(). Update() does NOTHING to a client side control. It doesnt cause it to refresh, you dont need to call it for the control to see new items.

The only thing update() does is:
For all rows in the data table that have a RowState of
Added/Modified/Deleted the relevant
Insert/Update/Delete query is run in the tableadapter in order to synch the state of the database with the client

I have created another query on this single dataset called fillvoid to return rows that are flagged as void.

But I cannot see how I bind this to the void combobox.
You dont bind Fill methods to controls.. Data sources are bound to controls. Changes to the data are reflected in the control.

Combo --binding--> BindingSource --binding--> DataTable


When you fill the table, the combo will show the new data

Do I need a second binding source and somehow call .fillvoid rther than .fill?

Look in the Form Load code
You see a Me.SomeTableAdapter.Fill(Me.SomeDataSet.SomeDataTable)

Put a button on the form
In the button click event put the code:
Me.SomeTableAdapter.FillVoid(Me.SomeDataSet.SomeDataTable)

Run app, look at combo, click button, look at combo

lastly, I can sort of see the benefit of doping it this way. It certainly was far easier to setup than the way I originally did it.

Also if I am grasping this correctly the app wont need much tweaking to take the new coding style
Hopefully!

As an additional info for you, click the Show All FIles button on Solution explorer, and just look at the code of the XXXDataSet.Designer.vb file

Look familiar? Its huge amounts of data access code, all generated by the IDE when you enter a few queries...

Read it an understand that there is nothing magical about the new ways, they just better encapsulate the old ways - the IDE has written hoardes of code for you, and done a good job. It stops you having to litter your program code with all that data access stuff

For another interesting thing, open the FormXXX.Designer.vb file.. thats all the code needed to make a form look like it does. Thats all the IDE does when you design a form. Write code, mountains of it.
 
To me, yes. The mix upper and lower case and spurious use of underscores, hungarian notation and overly-wordy variable names
Agreed, over the years I have seemly picked up this nasty habit:o

Just because it's a mess doesnt mean you cant be proud, but making your code clean is something that you will come to appreciate with experience.. For years, your mum yelled at you to clean your bedroom, but you never did. Then, when you get older and have kids, youre the tidy one and you yell at them.. Its "The Way It Is" :)
Funny thing is I thought it was doing it neatly, hell you should see a colleague of mine, no comments, no naming conventions at all and no indentation!

I'm being extreme here, but really, giving temporary variables long, descriptive names when they will only be used over a few (<10) lines of code is just creating clutter...
Pont taken;)

Uhuh, and old things need to be thrown out once in a while.. The very early '90s[sic] were days of the 80286, 640kb of memory and maybe Windows 3 ;)
Well yes way back at least 93' onwards when I was into basic and C learning again from ......... SAMS books!

If youre struggling with the difference between a type and an object instance, you should look to a tutorial on OO basic principles..
Nope I get it, but to me seeing something as you read down a block of code which says testdataset on one line and then TestDataSet on another looks to be the same thing. A bit like in English LIKE is the same as like only the case is different.

You dont bind Fill methods to controls.. Data sources are bound to controls. Changes to the data are reflected in the control.

Combo --binding--> BindingSource --binding--> DataTable


When you fill the table, the combo will show the new data


Quote:
Do I need a second binding source and somehow call .fillvoid rther than .fill?
Look in the Form Load code
You see a Me.SomeTableAdapter.Fill(Me.SomeDataSet.SomeDataTa ble)

Put a button on the form
In the button click event put the code:
Me.SomeTableAdapter.FillVoid(Me.SomeDataSet.SomeDataTable)

Run app, look at combo, click button, look at combo
My inability to express/explain myself correctly. I know you dont bind a fill method to a control. However I thought about this in slumber last night and see I came up with the correct solution as you detail here.

Also it does appear that my failing is this.

I can write some pretty snazzy programs and am not dumb, but in my journey of learning it appears that I have huge holes in the basis! I have since the 90's always stuck with SAMS books as I like the format, however even looking at the book on my desk it says when creating a control in one of the exercises....call it btnShowChild.

So you see I have only being doing what I have been taught!

Lastly....in my defence to you my judge and jury in this sad case of my abilities I offer that yes back in the 90'3 I taught myself assembler in order to write a keyboard intterupt handler to link into my C programm for a Sapce Invader game I wrote.

Thats my defence m'lud, I'm not thick (well I dont think I am) just misguided:o
 
Nope I get it, but to me seeing something as you read down a block of code which says testdataset on one line and then TestDataSet on another looks to be the same thing. A bit like in English LIKE is the same as like only the case is different.
C# perverts like me are very OCD about case.. Posting code here that the IDE has auto-genned for me with TitleCase variable names makes me feel dirty! ;) ;)

Given that VB.NET doesnt really care about case, it relies on background compilation to work out, when you write TestDataSet. whether to show you the type members (statics) or instance members..

In C# we dont do background compilation (whether its a pro/con is personal opinion) so the name is still important

In forums, where we dont have intellisense, experienced programmers will always prefer to be able to assess whether a variable, Property, Method() or Class is being referred to in a statement - and those are the specs to determine it. Another thing that I find mildly annoying about VB.NET is it doesnt force use of empty brackets for a method (unless option strict is on, i think), so methods can look like properties:

s.ToString

And you have to work out whether "ToString" is a verb or a noun to determine whether its amethod or poperty. For people who arent strong with english, verbs and nouns can be a real pain in the arse.

My inability to express/explain myself correctly. I know you dont bind a fill method to a control. However I thought about this in slumber last night and see I came up with the correct solution as you detail here.

As a concept, its called MVC - google it and have a read. Heres a brief into.
data is stored in a Model like a data table, array or soemthing. It is shown on screen by a View and the view must update when the data changes if it is to be a useful realtime app. The data is edited by a Controller and sometimes the controller makes sense to also be the view (e.g. TextBox)
For an example where the controller and view are separate, think of a button that clears a datatable. A grid is the View and it shows the data, press the Controller button and the data is cleared directly out the model, the grid updates to show nothing.

btnShowChild
I think I'd like to get my clippers out and go trim some beards at SAMS! Those vandals! ;)

So you see I have only being doing what I have been taught!
I'm sorry to have been so mean to you! :(

I taught myself assembler in order to write a keyboard intterupt handler to link into my C programm for a Sapce Invader game I wrote.
Aint it just the way, hardened sufferers dont get any reverence from disrespectful young whippersnappers like me, with their new, bright and shiny ideas that will be completely overhauled, scrapped and changed in 3 years anyway.. Assembling your own keyboard handler is a horror I hope I never have to do.. But thanks for writing it so that I can get on the interweb and annoy the old timers with my egotistical "My(crosoft's) way, or the highway" advocations ;)

I hope you can forgive me..

Thats my defence m'lud, I'm not thick (well I dont think I am) just misguided:o
That's what I'm here for.. You can also tell me to bugger off if you feel the need to. I'm pretty hard to offend ;)
 
I'm sorry to have been so mean to you! :(

I hope you can forgive me..


Quote:
Thats my defence m'lud, I'm not thick (well I dont think I am) just misguided:o
That's what I'm here for.. You can also tell me to bugger off if you feel the need to. I'm pretty hard to offend ;)

LOL there is no need to apologise or feel bad;)

I fully understand that everyone here offers help and advice out freely and it can becoming a pain when someone just does not grasp the concept of what is being offered.

I therefore would shy away from having a pop back as how would I learn otherwise? I am guilty of doing the same thing from time to time at work and at home.

Your input has only helped me to learn the errors of my ways preached by the 'SAMS Vandals';)

I appreciate you and any other member taking time out to try to help me:)

So there we go no offence taken, just happy I am able to obtain help on topics from those wiser then I;)

A point to note, I seemt o post a lot but dont answer others. Reasons being is most of the time others beat me to it, or I know the answer but have a crap memory and have to go back to my code to get the right answer only to find.....someone beat me to it.

:D
 
Back
Top