Cześć.
Ostatnio kodzę sobie w C#, a raczej zaczynam sie do tego języka przyzwyczajać. Trochę juz programuję, ciągle na amatorskim mocno poziomie, ale staram się wkręcić bardziej. Ale do rzeczy:
Kodzę sobie aplikację, w sumie z pkt widzenia problemu nieważne dokładnie jaką, Windows Forms i w ogóle, VC# 2008 Express.
Ogólnie strukturę kodu przedstawa się następująco (ciało funkcji pomijam, bo nieważne):
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace HandyOneTest
{
public partial class HandyOneTest1 : Form
{
//properties
private ArrayList datalist;
//methods
public HandyOneTest1()
{
InitializeComponent();
}
//events
protected override void OnPaint(PaintEventArgs e)
{
}
//po zrzuceniu draga na formę, ma się na niej pojawić ikona
private void HandyOneTest1_DragDrop(object sender, DragEventArgs e)
{
foreach (string file in (string[])(e.Data.GetData(DataFormats.FileDrop) ) )
{
}
}
private void HandyOneTest1_DragEnter(object sender, DragEventArgs e)
{
}
private void HandyOneTest1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
Application.Exit();
}
}
//HOGfxButton - HandyOne Gfx Button
//Button that is cappable of showing image (bmp, ico and others)
public class GfxButton : Control
{
//properties
public string FileName
{
get;
set;
}
//methods
//konstruktor
public GfxButton()
{
}
public GfxButton(int Left, int Top, string File, Bitmap bmp) : base("GfxButton", Left, Top, 32, 32)
{
}
//events
protected override void OnPaint(PaintEventArgs e)
{
//wywolanie bazowego OnPaint,zajmujacego
//sie podstawowym wyswietlaniem kontrolki
}
}
}
Oprócz tego jest standardowy plik Designera (na formatce leży picturebox i moja kontrolka (GfxButton). Wszystko siedzi w namespace HandyOneTest.
przy kompilacji pojawiają się następujące warningi i error:
Warning
Could not find type 'HandyOneTest.GfxButton'. Please make sure that the assembly that contains this type is referenced. If this type is a part of your development project, make sure that the project has been successfully built.
Warning
The variable 'gfxButton1' is either undeclared or was never assigned. C:\Documents and Settings\Jarek\Moje dokumenty\Visual Studio 2008\Projects\HandyOneTest\HandyOneTest\Form1.Designer.cs
Error
The type name 'GfxButton' does not exist in the type 'HandyOneTest.HandyOneTest1' C:\Documents and Settings\Jarek\Moje dokumenty\Visual Studio 2008\Projects\HandyOneTest\HandyOneTest\Form1.Designer.cs
Z tego co udało mi się znaleźć na necie (m.in. forum msdn) problem pojawia się w momencie, gdy nazwa namespace i nazwa klasy wewnątrz tejże przestrzeni nazw są takie same. Faktycznie, początkowo i u mnie tak było (forma i namespace były tak samo nazwane). Jednak zmiana nazwy klasy formy nic nie zmieniła. Zmiana nazwy namespace także nie zdziałała nic szczególnego, błędy pozostały. Kilkukrotnie sprawdzałem wszelkie nazwy i tak dalej i wszystko wydaje się zgadzać, nazwy klasy formy i gfxbuttona (też na początku nazywał się inaczej) pozmieniane wszędzie poprawnie. Jednak ciągle są te errory.
Gdzieś na necie znalazłem też info, jakoby ten bład mógł być powodowany zapętleniem podczas deklaracji, jakiś przykład z szablonami tam był, ale nie doszukałem się u siebie niczego takiego, co chociażby mogło przypominać takie zapętlenie.
Liczę się z możliwością, że jestem głupi i bład umyka mi, chociaż jest na samym środku ekranu wypisany wielką, różową czcionką. Dopuszczam też możliwośc, że tak nie jest ;) W każdym bądź razie z chęcią dowiedziałbym się, dlaczego VC# raczy mnie takim błędem, jak sie go pozbyć i ustrzec w przyszłości.
P.S.: wiem, że ta moja klasa GfxButton ma pewnie z dziesięć odpowiedników, a nawet samego pictureboxa mogę jako takiego użyć, używajac zdarzenia onclick. To jest program w dużej mierze "szkoleniowy", dzięki któremu w praktyce chcę się zapoznać z tworzeniem własnej kontrolki, obsługą eventów i ogólnie kodzeniem w C#, także prosiłbym o nie podsuwanie uwag, że można to zrobić inaczej ;)