Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Находки, заметки и ссылки, на интересные ресурсы по .NET 
:(
    Опции темы
AntonSaburov
Дата 29.3.2003, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Всем привет !

Данная тема появилась по нескольким причинам:
1. Хотелось бы все-таки, чтобы у нас посетители появлялись чаще.
2. Т.к. технология достаточно новая для многих на просторах СНГ (да вообщем-то и по миру), то какой-либо FAQ устраивать пока не получается - мало информации

Здесь будут пока собираться ваши находки, которые могут как-то помочь в освоении .NET.
Возможно, что в дальнейшем этот раздел превратиться во что-то более понятно. Ну а пока пусть будет в таком виде.

Все ваши находки вы можете опубликовывать сразу - тема не будет закрыта.

Большая просьба - подходите ответственно, публикуйте только проверенную информацию.[b]
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 29.3.2003, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Спасибо cully

Вот наткнулся на тот компонентик, который отображает свойства компонентов в VS .NET. Может это для кого-то и не новость, но все же. Идем в Toolbox, из контекстного меню выбираем Customize Toolbox, закладка .NET Framework Components, ищем там Property Grid, добавляем на Toolbox, выбираем, кидаем на форму, при загрузке формы такой код:

Код

private void frmMain_Load(object sender, System.EventArgs e)
{
  propertyGrid1.SelectedObject = this;
}


и далее в рунтайме меняем любые свойства формы, естественно, что этот компонент может редактировать свойства любого объекта. Т.е. в свое распоряжение мы получили довольно удобный, симпатичный, а главное мощный компонент редактор свойств.
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 29.3.2003, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Данная заметка не претендует на истину в последней инстанции - если кто-то нашел иное решение проблемы, милости прошу свои комментарии.

Итак, как только я стал разбираться с тредами мне само собой захотелось передать параметры в функцию, которая в этом треде исполняется. Увидев стандартное использование тредов, я не нашел возможности передать параметры и полез в MSDN (а куда же еще). И что я там вижу

Код
 
using System;
using System.Threading;

public class SimpleThread{

 public delegate void Start (object o);

 private class Args{
    public object o;
    public Start s;
    public void work(){
    s(o);
 }
 }

 public static Thread CreateThread (Start s, Object arg){

    Args a = new Args();
    a.o = arg;
    a.s = s;
    Thread t = new Thread (new ThreadStart (a.work));
    return t;
 }
}

class Worker{
 public static void WorkerMethod(object o){
    Console.WriteLine ("WorkerMethod: " + o);
 }
}

public class Work{
 public static void Main(){
    Thread t = SimpleThread.CreateThread (new SimpleThread.Start(Worker.WorkerMethod), 51);
    t.Start ();
    t.Join (Timeout.Infinite);
 }
}


Может я и стал с годами тупее, но сразу осознать, что и как происходит, к своему сожалению, я не смог.
После того, как я все-таки разобрался, я стал укладывать все в понятное русло для того, чтобы использовать технику передачи параметров в дальнейшем. И тут я понял еще более неприятное - я не могу это делать просто и понятно для себя.

После некоторых раздумий и проб я пошел по пути, который напоминает работу с тредами в JAVA - наследование класса Thread. Но т.к. наследовать в NET от Thread нельзя пришлось писать класс-обертку, после которой я все-таки смог увидеть, как мне быстро делать треды и использовать параметры.

Идея очень простая и иллюстрируется кодом:

Код

using System;
using System.Threading;

public class MyThread
{
  private Thread intThread;
  public int param1;
  public int param2;

  public MyThread(int new_param1, int new_param2)
  {
      param1 = new_param1;
      param2 = new_param2;
      intThread = new Thread(new ThreadStart(MyHandle));
  }

  public void Start()
  {
      intThread.Start();
  }

  private void MyHandle()
  {
      // Код процедуры, которая может использовать param1 и param2
      Console.WriteLine("Param1={0} Param2={1}", param1, param2);
  }
}

public class Worker
{
  public static void Main()
  {
      MyThread my = new MyThread(10,20);
      my.Start();
      Thread.Sleep(5000);
      Console.WriteLine("Finished");
  }
}


Данный пример в принципе должен давать исчерпывающие ответ.
Видно, что теперь мы можем передавать любое количество параметров понятным способом. Во всяком случае мне гораздо проще использовать такой подход, нежели который предлагает Microsoft.

Я не гарантирую, что кто-то такое уже не придумал, но пусть эта информация не пропадет.
PM MAIL WWW ICQ   Вверх
Baa
Дата 30.3.2003, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 1
Всего: 12



Появилась нужда узнать имя хоста из днс по его ип...
вот так это решается:
Код

using System.Net;
...
textBox1.Text = Dns.GetHostByAddress ("10.13.13.181").HostName;

з.ы. а вообще, сначала был против ентой техи (я про .NET), а теперь даже нравится smile.gif распробовал wink.gif


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
AntonSaburov
Дата 9.4.2003, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Данная информация для начинающих изучать WebApplication + ASP.

Все достаточно быстро соображают, что для создания WebApplication необходимо запустить IIS. Но как потом оказывается, этого недостаточно. Положив на форму какие-нибудь контролы, запускаем и ... страничка приходит без них.

Для того, чтобы IIS понимал, как обрабатывать такие страницы, необходимо установить дополнительные расширения. Для этого необходимо запустить файл

aspnet_regiis.exe -i

Обычно он находится в каталоге с csc.exe, ildasm.exe - WINNT\Microsoft.NET\Framework\v1.0.3705.
Последний каталог может отличаться - зависит от номера билда .NET
PM MAIL WWW ICQ   Вверх
simanyay
Дата 18.4.2003, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: нет
Всего: 36



Не знаю, насколько это заметка, но всё же... Лично я на этом попался. При объявлении указателя в С++ действия оператора * не распространяется на весь список переменных т.е.
int* p, q; // Указатель только p
А вот в C# распространяется:
int* p, q; // Указатель и p и q


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
AntonSaburov
Дата 18.4.2003, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Модератор:
Прошу всех не заниматься обсуждением находок в данном топике. Если есть вопросы - открывайте новую тему.
И прошу не обижаться - такого рода сообщения буду удалять.

PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 21.4.2003, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



"Как в VS.net работать с EXСEL"

Т.к. эта тема фактически является темой "Как работать с COM из .NET", то родился такой экспромт biggrin.gif


1. Создаем новый проект в .NET.
2. В Solution Explorer (Ctrl+Alt+L) на пункте Reference щелкаем правой кнопкой мыши и выбираем "Add Reference..."
3. В диалоговом окошке "Add Reference" выбираем закладку COM и там находим Microsoft Excel.
4. Делаем Select.
5. Нажимаем OK

Теперь можно работать.
Для примера просто поднимем Excel

Код

private void button3_Click(object sender, System.EventArgs e)
{
   Excel.Application ap = new Excel.Application();
   ap.Visible = true;
}


Если глянуть в каталог bin, то можно увидеть, что созданы дополнительные dll, которые по сути являются .NET обертками вокруг нужных COM-объектов. Обычно они имеют префикс Interop.*. Например для Excel будет Interop.Excel.dll.

Для более продвинутых программистов, которые могут определить какой файл необходимо обработать можно использовать утилиту tlbimp.
Ее описание можно найти в документации.
PM MAIL WWW ICQ   Вверх
AntonSaburov
Дата 21.4.2003, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



ВОПРОС
Приветствую, господа!
Обращаюсь к Вам с вопросом по C#. У меня проблема с программным назначением событий. Вроде делаю все правильно, но ничего не выходит. Ниже приведена часть кода реализующего всего лишь пару операций:
1) создать страничку TabPage в уже имеющимся TabControl на форме
2) поставить на нее (TabPage) один комонент RichTextBox
3) назначить событие ModifiedChanged для RichTextBox'a
4) изменить счетчики для правильности внутренней работы приложения.
После выполнения этого кода, функция ProgrammChanged(...) просто не выполняется. Может быть я что-то не так делаю? (скорее всего так оно и есть)

Код

int FilesCount=0;
int CurrentFile=0;

struct TFile
{
 public string Name;
 public bool Modified;
 public bool HavePath;
 public TabPage FilePage;
 public RichTextBox ProgData;
};

TFile[] OpenFiles;

private void ProgrammChanged(object sender, EventArgs e)
{
 OpenFiles[CurrentFile].Modified=true;
}

void OpenFilePage(string Name, bool Modified, bool HavePath)
{
 if (FilesCount==10)
 {
 MessageBox.Show(this, "You can't open more than 10 files. Please close one of them to create new one.", "Error");
 }
 else
 {
 OpenFiles[++FilesCount-1].Name=Name;
 OpenFiles[FilesCount-1].Modified=Modified;
 OpenFiles[FilesCount-1].HavePath=HavePath;
 OpenFiles[FilesCount-1].FilePage = new TabPage(); // (1)
 OpenFiles[FilesCount-1].FilePage.Text=Name;
 FilesControl.TabPages.Add(OpenFiles[FilesCount-1].FilePage);
 OpenFiles[FilesCount-1].ProgData = new RichTextBox(); // (2)
 OpenFiles[FilesCount-1].ProgData.Parent=OpenFiles[FilesCount-1].FilePage;
 OpenFiles[FilesCount-1].ProgData.Dock=DockStyle.Fill;
 OpenFiles[FilesCount-1].ProgData.ModifiedChanged += new EventHandler(this.ProgrammChanged); // <-- HERE !!! (3)
 CurrentFile=FilesCount-1; //(4)
 FilesControl.SelectedIndex=CurrentFile;
 }
}

private void MainForm_Load(object sender, System.EventArgs e)
{
 OpenFiles = new TFile[10];
 OpenFilePage("Undefined", false, false);
}



ОТВЕТ
Я поэкспериментировал - действительно, достаточно странное поведение. Хотя понять его можно.

Вообщем дело в следующем - если просто меняешь текст в RichEdit, то Modified устанавливается в true. Но НИКАКИХ обработчиков при таком изменении текста не вызывается.

А вот если ты ручками меняешь Modified на противоположное значение, то функция вызывается.
Т.е. если ты менял текст, то Modified устанавливается в TRUE и при установке его в FALSE обработчик вызывается. Если ты не менял текст и решил поставить Modified в TRUE, то обработчик опять же вызывается.

В принципе логика объяснима - если текст имеет признак, что его МЕНЯЛИ, то смена признака на то, что его НЕ МЕНЯЛИ должно приводить к некоторым действиям по обработке такого важного события.
И обратное событие тоже - НЕ МЕНЯЛИ на МЕНЯЛИ.
PM MAIL WWW ICQ   Вверх
neutrino
Дата 24.4.2003, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Приветствую, господа!

Вот код, который я состряпал для нахождения положения каретки в RichTextBox.

Цитата

RichTextBox MyTextBox;

void main()
{
    MyTextBox = new RichTextBox();
    MyTextBox.Parent = Form1;
    MyTextBox.Dock = DockStyle.Fill;
    MyTextBox.SelectionChanged += new EventHandler(this.CaretMoved);
}

void CaretMoved(object sender, EventArgs e)
{
    int SLen=0;
    System.Drawing.Graphics G = MyTextBox.CreateGraphics();
    int Rows = MyTextBox.GetLineFromCharIndex(MyTextBox.SelectionStart);
    int Cols = MyTextBox.SelectionStart;
    for (int I=0;I<MyTextBox.Lines.GetLength(0); I++) {
        SLen+=MyTextBox.Lines[I].Length+1;
        if (SLen>Cols) break;
    }
    if ((I==MyTextBox.Lines.GetLength(0)-1)&&(MyTextBox.Lines[I]=="")) Cols=0;
    else {
        Point P=MyTextBox.GetPositionFromCharIndex(Cols);
        Cols-=MyTextBox.GetCharIndexFromPosition(new Point(0, P.Y));
    }
    statusBar.Panels[0].Text = "Col: " + (Cols+1).ToString();
    statusBar.Panels[1].Text = "Row: " + (Rows+1).ToString();
}


Это сообщение отредактировал(а) AntonSaburov - 24.4.2003, 18:14


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 19.6.2003, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Баги и их последствия:
Это то, что я успел накопать при работе с .NET. Теперь делюсь.

1. При отладке приложения если строка содержит 0 в центре строки, то в окне Watch вы увидите
только, что находится до 0. А дальше ничего. Хотя строка реально может быть длиннее.
И дебагер Вам скажет, что длина именно до нуля. Вот такой вот дебагер.

2. Array.GetValue(idx). На эти грабли я наступил часа на два - по документации он должен
возвращать Exception в случае, если индекс выходит за границы массива. Так вот функция просто
прерывается и все. Никаких исключений под дебагером, никаких исключений в RunTime.
А так как этот вызов у меня был последним в функции, то повис я с ним ...
PM MAIL WWW ICQ   Вверх
stab
Дата 5.10.2003, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



почти 7 (семь) месяцов назад мною была поднята следующая тема:

http://forum.vingrad.ru/index.php?act=ST&f=47&t=6749

... и вот решение найдено smile.gif


Код

using System.Runtime.InteropServices;
using System.Reflection;
using System.Reflection.Emit;

...

 private void button1_Click(object sender, System.EventArgs e)
 {
  AssemblyName an = new AssemblyName();
  an.Name = "BeepAssembly";
  AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
  ModuleBuilder mb = ab.DefineDynamicModule("BeepModule");
  TypeBuilder tb = mb.DefineType("BeepClass", TypeAttributes.Public);
  MethodBuilder meb = tb.DefineMethod("Beep", MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PinvokeImpl, null, new Type[] {typeof(int), typeof(int)});
  CustomAttributeBuilder cab = new CustomAttributeBuilder(typeof(DllImportAttribute).GetConstructor(new Type[] {typeof(string)}), new Object[] {"kernel32.dll"});
  meb.SetCustomAttribute(cab);
  tb.CreateType();
  tb.InvokeMember("Beep", BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new Object[] {1000, 500});

 }


сей код динамически вызывает Beep(...) из kernel32

з.ы. жалко AntonSaburov больше не появляется, он бы порадовался.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AntonSaburov
Дата 28.10.2003, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Возникла тут задача - добавить пункт в системное меню. После некоторого думания и хождениа по MSDN и Инету родилось вот такое. (Кусок просто добавляется к форме)

Код

public const Int32 WM_SYSCOMMAND = 0x112;
public const Int32 MF_SEPARATOR = 0x800;
public const Int32 MF_STRING = 0x0;
public const Int32 IDM_ABOUT  = 1000;

private void frmMain_Load(object sender, System.EventArgs e)
{
   IntPtr sysMenuHandle = GetSystemMenu(this.Handle, false);
   AppendMenu(sysMenuHandle, MF_SEPARATOR, 0, string.Empty);
   AppendMenu(sysMenuHandle, MF_STRING, IDM_ABOUT, "About PC SW...");  
}

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
private static extern bool AppendMenu (IntPtr hMenu, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);

protected override void WndProc(ref Message m)
{
   if(m.Msg == WM_SYSCOMMAND)
   {
       switch(m.WParam.ToInt32())
       {
           case IDM_ABOUT :
               System.Windows.Forms.MessageBox.Show("About ...");
               return;
           default:
               break;
       }
   }
   base.WndProc(ref m);
}

PM MAIL WWW ICQ   Вверх
foRaver
Дата 14.11.2003, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: 1
Всего: 3



Незнаю, может кому и пригодится...
у меня тут по C# книжечка вPDF завалялась от O'Ryllie...
и по VB.NET (language in nutshell), тоже от этого-же издания.
Если кому надо, обрашажтесь. ;)
PM MAIL WWW ICQ YIM   Вверх
AntonSaburov
Дата 16.12.2003, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Спасибо dead_ricky
Вопрос
Установил VS.NET и MSDN к нему. Запуская VS нажимаю F1 вылазиет сообщение что мол MSDNа, то нету, мол нажмите F1 для того что бы узнать чтобы делать далеьше.
Так вот если нажать этот F1, то там предлагают установить MSDN, а если нажать OK (на этом диалоговом окне с мерзким сообщением) или Esc, то все ништяк, MSDN прекрасно работает.
Ну меня это сообщение раздаражает, может кто знает как от него избавиться!

Ответ
Все, проблема решена! Если кому интересно, то могу рассказать как.
А вот как.
У меня версия VS 7.1 а MSDN под 7.0. Полазив в реестре, в узле:
[H(точно не помню)\Software\Microsoft\VisualStudio\...]
нашел две папки (или как их там): 7.0 и 7.1. В обоих папках были папки Help.
Малость посмотрев на них и особо ничего не поняв, решил папку 7.1\Help заменить папкой 7.0\Help.
И все заработало! Т.е. исчезли все мерзкие сообщения!

PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.