• Problem with Align text.
    5 replies, posted
I don't know why I have this error. [lua]cLabel = {}; -- We need a table to define and store our custom control in. cLabel.Text = nil; -- The text we are displaying cLabel.TextAlign = nil; -- How to align the text; 0 means left, 1 means center. cLabel.Font = nil; cLabel.Color = nil; -- Initialize function; this is called when the object is created function cLabel:Init() -- Inside these functions, we use self.(property), because we are referencing self.Text =""; -- self.TextAlign = 0; -- unless otherwise specified, we will want to align left. self.Font = "ScoreboardText"; -- This is our default font self.Color = Color( 255,255,255,255 ); end function cLabel:Paint() -- This is where we do all the painting. if ( self.TextAlign == 1 ) then x = self:GetWide() / 2; else x = 0; end -- Arguments: Text, Font, X Pos, Y Pos, Color, Text Alignment draw.DrawText( self.Text, self.Font, x, 0, self.Color, self.TextAlign ); return true; end cFrame = vgui.Create( "frame" ); cFrame:SetSize( 200,100 ); cFrame:SetPos( 0,0 ); cFrame:PostMessage( "SetTitle", "text", "cLabel Test" ); cFrame:SetVisible( true ); cLabelTest = vgui.Create( "cLabel", cFrame ); cLabelTest:SetSize( 50, 10 ); cLabelTest:SetPos( 4, 20 ); cLabelTest:SetText( "Test" ); cLabelTest:SetAlign( 1 ); -- Properties -- Here, we are basically making it so that instead of accessing the variables directly, -- we are making it so that we can check to make sure that the value is valid for what -- we are setting. Also, if you need to use it with a timer, you can use these instead of -- creating other functions. function cLabel:SetText( text ) self.Text = text; -- Make sure that you're using self! end function cLabel:GetText() return self.Text; end function cLabel:SetAlign( align ) if ( align == 0 || align == 1 ) then self.TextAlign = align; else Msg( "Invalid align [" .. align .. "] passed to control!\n" ); end end function cLabel:GetAlign() return self.TextAlign; end function cLabel:SetFont( font ) self.Font = font; end function cLabel:GetFont() return self.Font; end function cLabel:SetColor( color ) if ( string.lower( type( color ) ) != "color" ) then Msg( "Invalid color passed to label!\n" ); return false; else self.Color = color; end end function cLabel:GetColor() return self.Color; end cButton = {}; cButton.OnMouseDown = nil; -- More on these two later cButton.OnMouseUp = nil; cButton.State = nil; -- States: -- 0: Idle -- 1: User is holding down the mouse on this control function cButton:Paint() return true; -- We don't want the cLabel:Paint() function being called end function cButton:OnMousePressed( m ) end function cButton:OnMouseReleased( m ) end myButton.OnMouseDown = function() msg( "Mouse down!" ) end myButton.OnMouseUp = function() msg("Mouse up!" ) end function cButton:OnMousePressed( m ) self.State = 1; -- Mouse Down if ( self.OnMouseDown != nil ) then self.OnMouseDown( m ); end end function cButton:OnMouseReleased( m ) self.State = 0; -- Mouse Up if ( self.OnMouseUp != nil ) then self.OnMouseUp( m ); end end function cButton:Paint() // Draw Border if ( self.State == 1 ) then surface.SetDrawColor( 0,0,200,255 ); -- Blue surface.DrawRect( 4,4,self:GetWide()-8,self:GetTall()-8 ); else // The only other state should be 0, but if it's something else for some weird reason, we still want it. surface.SetDrawColor( 200,100,0,255 ); -- Orange surface.DrawRect( 0,0,self:GetWide(),self:GetTall() ); end // Draw Inside surface.SetDrawColor( 100,100,100,255 ); -- Orange surface.DrawRect( 4,4,self:GetWide()-8,self:GetTall()-8 ); // Draw Text //Text, font, x, y, color, align draw.DrawText( self.Text, self.Font, self:GetWide() / 2, 3, Color(255,255,255,255 ), 1); return true end cFrame = vgui.Create( "frame" ); cFrame:SetSize( 200,100 ); cFrame:SetPos( 0,0 ); cFrame:PostMessage( "SetTitle", "text", "cLabel Test" ); cFrame:SetVisible( true ); cLabelTest = vgui.Create( "cLabel", cFrame ); cLabelTest:SetSize( 100, 25 ); cLabelTest:SetPos( 50, 20 ); cLabelTest:SetText( "Test" ); cLabelTest:SetAlign( 1 ); cButtonTest = vgui.Create( "cButton", cFrame ); cButtonTest:SetSize( 100, 25 ); cButtonTest:SetPos( 55, 35 ); cButtonTest:SetText( "Click Me!" ); cButtonTest.OnMouseDown = function() cLabelTest:SetText("Mouse Down!") end cButtonTest.OnMouseUp = function() cLabelTest:SetText("Mouse Up!") end vgui.Register( "cLabel", cLabel, "Panel" ); [/lua] [code] autorun\client\cl_test.lua:59: attempt to concatenate global 'aling' (a nil value) [/code]
It means you misspelled "align" on line 59. It looks like you fixed here in this code, so that wouldn't be a problem. My guess is it would be this line here: [code]Msg( "Invalid align [" .. align .. "] passed to control!\n" ); [/code]
Weird I don't see misspelling
Now I get this error : [code]autorun\client\cl_test.lua:40: attempt to index global 'cLabelTest' (a nil value) [/code] [lua]cLabel = {}; -- We need a table to define and store our custom control in. cLabel.Text = nil; -- The text we are displaying cLabel.TextAlign = nil; -- How to align the text; 0 means left, 1 means center. cLabel.Font = nil; cLabel.Color = nil; -- Initialize function; this is called when the object is created function cLabel:Init() -- Inside these functions, we use self.(property), because we are referencing self.Text =""; -- self.TextAlign = 0; -- unless otherwise specified, we will want to align left. self.Font = "ScoreboardText"; -- This is our default font self.Color = Color( 255,255,255,255 ); end function cLabel:Paint() -- This is where we do all the painting. if ( self.TextAlign == 1 ) then x = self:GetWide() / 2; else x = 0; end -- Arguments: Text, Font, X Pos, Y Pos, Color, Text Alignment draw.DrawText( self.Text, self.Font, x, 0, self.Color, self.TextAlign ); return true; end cFrame = vgui.Create( "frame" ); cFrame:SetSize( 200,100 ); cFrame:SetPos( 0,0 ); cFrame:PostMessage( "SetTitle", "text", "cLabel Test" ); cFrame:SetVisible( true ); cLabelTest = vgui.Create( "cLabel", cFrame ); cLabelTest:SetSize( 50, 10 ); cLabelTest:SetPos( 4, 20 ); cLabelTest:SetText( "Test" ); cLabelTest:SetAlign( 1 ); -- Properties -- Here, we are basically making it so that instead of accessing the variables directly, -- we are making it so that we can check to make sure that the value is valid for what -- we are setting. Also, if you need to use it with a timer, you can use these instead of -- creating other functions. function cLabel:SetText( text ) self.Text = text; -- Make sure that you're using self! end function cLabel:GetText() return self.Text; end function cLabel:SetAlign( align ) if ( align == 0 || align == 1 ) then self.TextAlign = align; else Msg( "Invalid align [" .. align .. "] passed to control!\n" ); end end function cLabel:GetAlign() return self.TextAlign; end function cLabel:SetFont( font ) self.Font = font; end function cLabel:GetFont() return self.Font; end function cLabel:SetColor( color ) if ( string.lower( type( color ) ) != "color" ) then Msg( "Invalid color passed to label!\n" ); return false; else self.Color = color; end end function cLabel:GetColor() return self.Color; end cButton = {}; cButton.OnMouseDown = nil; -- More on these two later cButton.OnMouseUp = nil; cButton.State = nil; -- States: -- 0: Idle -- 1: User is holding down the mouse on this control function cButton:Paint() return true; -- We don't want the cLabel:Paint() function being called end function cButton:OnMousePressed( m ) end function cButton:OnMouseReleased( m ) end myButton.OnMouseDown = function() msg( "Mouse down!" ) end myButton.OnMouseUp = function() msg("Mouse up!" ) end function cButton:OnMousePressed( m ) self.State = 1; -- Mouse Down if ( self.OnMouseDown != nil ) then self.OnMouseDown( m ); end end function cButton:OnMouseReleased( m ) self.State = 0; -- Mouse Up if ( self.OnMouseUp != nil ) then self.OnMouseUp( m ); end end function cButton:Paint() // Draw Border if ( self.State == 1 ) then surface.SetDrawColor( 0,0,200,255 ); -- Blue surface.DrawRect( 4,4,self:GetWide()-8,self:GetTall()-8 ); else // The only other state should be 0, but if it's something else for some weird reason, we still want it. surface.SetDrawColor( 200,100,0,255 ); -- Orange surface.DrawRect( 0,0,self:GetWide(),self:GetTall() ); end // Draw Inside surface.SetDrawColor( 100,100,100,255 ); -- Orange surface.DrawRect( 4,4,self:GetWide()-8,self:GetTall()-8 ); // Draw Text //Text, font, x, y, color, align draw.DrawText( self.Text, self.Font, self:GetWide() / 2, 3, Color(255,255,255,255 ), 1); return true end cFrame = vgui.Create( "frame" ); cFrame:SetSize( 200,100 ); cFrame:SetPos( 0,0 ); cFrame:PostMessage( "SetTitle", "text", "cLabel Test" ); cFrame:SetVisible( true ); cLabelTest = vgui.Create( "cLabel", cFrame ); cLabelTest:SetSize( 100, 25 ); cLabelTest:SetPos( 50, 20 ); cLabelTest:SetText( "Test" ); cLabelTest:SetAlign( 1 ); cButtonTest = vgui.Create( "cButton", cFrame ); cButtonTest:SetSize( 100, 25 ); cButtonTest:SetPos( 55, 35 ); cButtonTest:SetText( "Click Me!" ); cButtonTest.OnMouseDown = function() cLabelTest:SetText("Mouse Down!") end cButtonTest.OnMouseUp = function() cLabelTest:SetText("Mouse Up!") end vgui.Register( "cLabel", cLabel, "Panel" );[/lua]
vgui.Create returned nil, something went wrong with creating clabel.
Umm, you register cLabel after you create a cLabel. That won't work. You have to register, THEN create.
Sorry, you need to Log In to post a reply to this thread.