Jag skrev ett inlägg om detta problemet för ett par dagar sedan men fick inget vettigt svar. Jag har funderat mycket på det och försökt hitta någon logisk förklaring men har inte lyckats. Jag har inte pysslat så mycker med klasser i VB, men borde det inte räcka att skriva: CurrentMonth = 4 ? (Så gör man i c++ iaf och jag är för lat för att testa...;) ) jo, det funkar. Men jag vill kunna använda me i och med att det förklarar bättre vad man gör; inga missförstånd. Dessutom är det bra och veta varför det är på detta och viset, om det bara gäller me osv. Okej, jag har hittat ett mönster: Om jag testar me.egenskap i t.ex. en if-sats så funkar det. Men om jag prövar att ge t.ex. me.egenskap ett värde så går det inte; "Method or data member not found". Huh.. Det får du allt förklara lite djupare. Jag vill ha egenskaper i klassen, hur har jag det utan let/get? Varför är det dåligt med Let/Get? Men nu får ni ju ge er .. gjorde följande test: Jajaj Patrik.... Jag bara hakade på. Jag läste texten.... Jag gör inget speciellt i min egenskap, bara returnerar eller ändrar en variabel. Vad jag har för nivå på felhantering verkar var irrelevant i och med att jag får errorn när koden körs, om jag inte kör ctrl+F5. Det bästa vore om någon kunde köra mitt projekt på sin dator och se om det uppför sig p samma vis... Om någon har lust att lägga ner så mycket tid. I IDL definieras även metoder som propput och propget funktioner. Vad vill du ha sagt? nä den exakta syntaxen finns inte i c/C++ men funktionaliten finns där med en annan syntax ... Vad är IDL? >Jag menar vaffö finns inte property get/let/set i C/C++ ???? Ok, här kommer _hela_ klassen. Ok, jag har hittat problemet. Det är ganska säkert en bugg i vb: Varför vill man ha privata let / get ? En bra anledning för att använda privata property let/get är om man manipulerar värdena när dom tilldelas eller avläses, då slipper man göra en funktion av de. Det vill man absolut, men vb gnäller om man försöker ändra en privat egenskap via me. Jag förstår iallafall inte varför du måste använda "me" när du är i klassen? Jag kan se en MYCKET bra anledning till att välja att använda me. Om man har ett större projekt med flera komponenter som är likartade i koden så är det det enda bra sättet att tydliggöra att man arbetar mot sina egna egenskaper och inte de andra komponenternas. Nu kan man ju iofs argumentera att systemet är felkodat om sådan tydlighet behövs men det kan ju vara ett gammalt projetk som man rättar buggar, strukturerar upp eller helt enkelt inte har tid att koda om... Ok, det låter logiskt. Anledning till att jag frågade var att jag aldrig reflekterat över att göra så. Me är en implicit deklarerad objektvariabel som refererar till det objekt man befinner sig i. 'Me.' listar alltså endast public och friend metoder i objektet, eftersom man ju så att säga får en extern syn av objektet.Me i klasser
Så här ligger det till:
Jag använder Me i en klass för att komma åt klassens privata och publika egenskaper och metoder. Dvs jag använder Me i klassen(Me syftar på själva klassen). Detta funkar alldeles utmärkt.
I en annan klass använder jag Me; jag skriver Me. och får upp en lista över metoder och egenskaper som klassen har. Jag väljer en egenskap och skriver in ett värde. T.ex me.CurrentMonth = 4. När jag sedan kör programmet får jag errorn "Method or data member not found"och markerar CurrentMonth. Notera att jag fick upp CurrentMonth i listan när jag skrev me. .
Det verkar som att ett with statement påverkar vad me pekar på men jag har inget with statement i gällande sub, jag har faktiskt inte en enda i hela klassen.
Kan någon berätta vad som pågår?
mvh FransSv: Me i klasser
/JohanSv: Me i klasser
mvh FransSv: Me i klasser
+---------------------------------+
| LÅTER INTE DETTA SJUKT?! |
+---------------------------------+Sv: Me i klasser
(äntligen någon som yttrar sig om detta problem)
mvh FransSv: Me i klasser
problemet har ingenting med let/get att göra ... utan är en bugg ... Sv: Me i klasser
<code>
Option Explicit
Dim m_iTest As Integer
Public Property Get test() As Integer
test = m_iTest
End Property
Public Property Let test(value As Integer)
m_iTest = value
End Property
Public Sub go()
Me.test = 5
If Me.test = 5 Then MsgBox "hallå"
End Sub
</code>
funkade hur bra som helst ... måste vara något i din interface deklaration som inte vill ...
Hur ser din klass ut ?? Vad har du för nivå på felhanteringen ?? break on all errors / break in class el. break on unhandled ???
vad gör du i din property ?? Sv: Me i klasser
Kommer i alla fall inte använde dem förräns jag blir nödgad att göra det.
Jag menar vaffö finns inte property get/let/set i C/C++ ????
[peter.h]Sv: Me i klasser
mvh FransSv: Me i klasser
Sv: Me i klasser
Sv: Me i klasser
Notera om jag skiter i att använda me, utan istället bara anger egenskapen(dvs egenskap = X istället för me.egenskap = X) så funkar det alldeles utmärkt.
Vad ska jag göra?
mvh FransSv: Me i klasser
och
>nä den exakta syntaxen finns inte i c/C++ men funktionaliten finns där med en annan syntax ...
Det vore trevligt om ni kunde hålla isär C och C++. Det är liksom olika språk.
Objektorientering existerar inte i C. Det enda som finns är struct som är tillhandahållen i första hand för att det är praktiskt.
Anledningen till att det inte finns något property let/get/set för C är för att en struct alltid har publika variabler...
/Niklas JanssonSv: Me i klasser
'==========BOF===========
<code>
Option Explicit
Private prop_CurrentMonth As Integer
Private prop_CurrentYear As Integer
Private Sub Class_Initialize()
Dim objRst As New ADODB.Recordset
Dim I As Integer
Dim OldType As Integer
Dim CurType As Integer
With frmMain
CurrentMonth = MyDate.CurrentMonth
CurrentYear = MyDate.CurrentYear
Call LoadLanguage
'----------Fixar ricmbyear(dvs aktuella året)----------
For I = 2000 To 2100
.RiCmbYear.AddItem I
Next I
.RiCmbYear.ListIndex = (Year(Date) - 2000)
'----------------------------------------------------
'---------Fixar Månadsbilder mm----------------------
'väljer bild efter MyDate.CurrentMonth
'----------------------------------------------------
'------------riflxRoomInfo-----------------------------
.RiFlxRoomInfo.FixedCols = 1
.RiFlxRoomInfo.FixedRows = 1
'----fixar datumen och skriver in bokningarna----------
If RenderFlexGrid(MyDate.CurrentMonth, MyDate.CurrentYear) = False Then
MsgBox "blabla, bananerna har ruttnat"
MyLog.AddEntity "RenderFlexGrid genererade ett fel"
End If
'------------------------------------------------------
'------------------------------------------
End With
End Sub
Private Function LoadLanguage() As Boolean
'On Local Error GoTo Err
LoadLanguage = True
Exit Function
Err:
LoadLanguage = False
End Function
Private Function RenderFlexGrid(Month As Integer, Year As Integer) As Boolean
'On Local Error GoTo Err
Dim objRst As New ADODB.Recordset
Dim I As Integer
Dim Sql As String
Dim NiceMonth As String * 2
Dim DDiff As Integer
Static NotFirstTime As Boolean
Static rstRooms As Recordset
If Month < 10 Then
NiceMonth = "0" & Month
Else
NiceMonth = Month
End If
'rensar flexen
frmMain.RiFlxRoomInfo.Clear
'---------Bytar Bild---------------
'----------------------------------
'----fixar rummen, vertikalt-------
If NotFirstTime = False Then
Dim OldType As Integer
Dim CurType As Integer
Set rstRooms = objCon.Execute("SELECT type FROM rooms ORDER BY type")
frmMain.RiFlxRoomInfo.Rows = rstRooms.RecordCount + 1
NotFirstTime = True
End If
rstRooms.MoveFirst
I = 1
Do Until rstRooms.EOF
OldType = CurType
Do Until CurType <> OldType
CurType = rstRooms(0)
frmMain.RiFlxRoomInfo.TextMatrix(I, 0) = "Rumstyp" & rstRooms(0).Value
rstRooms.MoveNext
I = I + 1
Loop
Loop
'------------------------------------------------------------------------
'---------Gör översta kolumnen snygg(datum raden)------------------------
frmMain.RiFlxRoomInfo.Cols = 1 + MyDate.DaysInMonth(Year, Month)
For I = 1 To frmMain.RiFlxRoomInfo.Cols - 1
frmMain.RiFlxRoomInfo.TextMatrix(0, I) = I & "/" & Month
Next I
'------------------------------------------------------------------------
'---------Hämtar relevanta bokningar och visar dem i flexgrid:en---------
Sql = _
"SELECT id, status, room, date_start, date_end, prim_customer " & _
"FROM bookings " & _
"WHERE (date_start <= '" & frmMain.RiCmbYear.Text & "-" & NiceMonth & "-" & "01' " & _
");"
Set objRst = objCon.Execute(Sql)
If objRst.RecordCount >= 1 Then
objRst.MoveFirst
Do Until objRst.EOF
DDiff = DateDiff("d", objRst(3), objRst(4))
For I = 0 To DDiff
If Day(objRst(3)) + I <= MyDate.DaysInMonth(Month) Then 'vi ska bara visa för den aktuella månaden
frmMain.RiFlxRoomInfo.Col = Day(objRst(3)) + I
frmMain.RiFlxRoomInfo.Row = objRst(2)
frmMain.RiFlxRoomInfo.CellBackColor = vbRed
End If
Next I
objRst.MoveNext
Loop
End If
'------------------------------------------------------------------------
'-----Ändrar width på kolumnerna-----
For I = 1 To frmMain.RiFlxRoomInfo.Cols - 1
frmMain.RiFlxRoomInfo.ColWidth(I) = 550
Next I
'------------------------------------
RenderFlexGrid = True
Exit Function
Err:
RenderFlexGrid = False
End Function
'//////////////////////////////////////////////////////////////
Public Sub RiCmdNextMonth_Click()
If Me.CurrentMonth <= 12 Then 'Här gnäller den inte.."
Call RenderFlexGrid(Me.CurrentMonth, Me.CurrentYear)
Me.CurrentMonth = Me.CurrentMonth + 1 'HÄR BLIR DET "Method or datamember not found"
End If
End Sub
'//////////////////////////////////////////////////////////////
Public Sub RiCmdPreviousMonth_Click()
If Me.CurrentMonth >= 2 Then
Call RenderFlexGrid(Me.CurrentMonth, Me.CurrentYear)
Me.CurrentMonth = Me.CurrentMonth - 1
End If
End Sub
Public Sub RiCmbyear_Click()
Me.CurrentYear = frmMain.RiCmbYear.Text
End Sub
Public Property Get CurrentMonth() As Integer
CurrentMonth = prop_CurrentMonth
End Property
Private Property Let CurrentMonth(NewValue As Integer)
If (NewValue >= 1) And (NewValue <= 12) Then
prop_CurrentMonth = NewValue
End If
End Property
Public Property Get CurrentYear() As Integer
CurrentYear = prop_CurrentYear
End Property
Private Property Let CurrentYear(NewValue As Integer)
If CurrentYear > 0 Then
prop_CurrentYear = NewValue
End If
End Property
'=================EOF=================='
</code>Sv: Me i klasser
Som min kod i mitt förra inlägg visar så är bägge egenskapernas let-subbar private. Jag ändrade dem till public och då var vb nöjd. Detta borde absolut inte vara några problem i och med att jag använder me inuti klassen och där är en private sub "synlig". Tyv'r så klarar me inte av det, man får köra 'implicit' istället och skita i me, dvs egenskap istället för me.egenskap.
Slut på denna lilla historian..
mvh FransSv: Me i klasser
Anväds inte dessa för att skicka in resp hämta värden från klassen samt att kunna kontrollera att värdet som skall in i klassen är av rätt format etc.?Sv: Me i klasser
Sv: Me i klasser
mvh FransSv: Me i klasser
Kan du förklara skillnaden för mig. "me.Görnåt" kontra "Görnåt"Sv: Me i klasser
En annan anlednign till att ha privata property let/get är också att vissa kanske man på sikt vill göra till friend för object-collections och sånt...Sv: Me i klasser
Sv: Me i klasser
I exemplet ovan var ju Get public så det var alltså den som syntes i listan.
/johan/