Вопрос: а закем кнопку удалять? Сделать ей visible=false и подвинуть на ее место другую, а еще лучше просто в обработчике для кнопок (как я понимаю для всех кнопок функция-обработчик одна и та же) просто перенумеровать кнопки а последнюю из 20 кнопок скрыть (насколько я помню ты писал что кнопок будет не больше 20).
» FAQ по Borland C++ Builder
Zyava
Updated Всё я разобрался!!
Вобщем я буду делать так: Form1->Controls[i]->Free();
--------------
Вобщем такая фигня, ни Show() не Hide() на кнопки не применяются. Только ShowMessage и другие функции которые не влияют на саму кнопку. Не знаю почему. Сейчас вот только хочу разобраться с удалением. А так почти уже всё написал.
Да конечно кнопок не много но охото сразу привыкать к хорошему, компактному и эффективному коду,
не буду же я делать все 20 кнопок вручную.
А так вообщем можно накидать на ГУЮ контролов и готово, могу даже сейчас сделать, как вариант.
Вот код:
Заголовочный код:
[more]
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMainMenu *ShorCuts;
TMenuItem *Options1;
TMenuItem *NewButton1;
void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall Options1Click(TObject *Sender);
void __fastcall NewButton1Click(TObject *Sender);
private: // User declarations
public: int i; char Ch[100]; int Size; int ix; TButton* MyButton; // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall ButtonPressed(TObject *Sender);
};
[/more]
И код программы:
[more]
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//---
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonPressed(TObject *Sender)
{
MyButton->Free();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Options1Click(TObject *Sender)
{
Options->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewButton1Click(TObject *Sender)
{
if (ix <= 18){
Form1->Focused();
Clipboard()->GetTextBuf(Ch, 100);
Clipboard()->SetTextBuf(Ch);
Clipboard()->Close();
TButton* MyButton = new TButton (Form1);
MyButton->OnClick = ButtonPressed;
MyButton->Width = 33;
MyButton->Height = 33;
MyButton->Top = 8;
MyButton->Left = i + 8;
MyButton->Hint = Ch;
MyButton->ShowHint = Ch;
MyButton->ComponentIndex = ix;
MyButton->Parent = Form1;
//ShowMessage(MyButton->ComponentIndex);
i += 35;
ix++;
}
}
[/more]
Вот уже что-то вырисовывается, конечно, я это всё изменю, подправлю дизайн, сделаю алгоритм по работе со строками что бы он делал интервалы. Как уже говорил оно будет менеджером буфера обмена, у меня идея уже возникла давно, из Космических Рейнджеров, в этой игре была панель где игрок хранил всяку информацию: типа там прайс-листы товаров, задания...Вот. У меня вот вобщем то только из-за этого появилось желание изучить C++,
и он мне стал нравится.
Я раньше скриптил в VBScript, AutoIt но там конечно нету таких возможностей, что и говорить.
Да и большущее спасибо вам ребята, за помощь Я вообще люблю этот форум, тут и помогут и пенделя конечно могут дать, но от этого он только становится лучше и информативнее.
RUBOARD fore4ver!!Остапа понесло...)
А ещё такой вопросик посоветуйте толковую книгу по BCB, что нибудь типа справочника, а то вся куча книг котороя у меня есть учит только кнопки рисовать.
Updated Всё я разобрался!!
Вобщем я буду делать так: Form1->Controls[i]->Free();
--------------
Вобщем такая фигня, ни Show() не Hide() на кнопки не применяются. Только ShowMessage и другие функции которые не влияют на саму кнопку. Не знаю почему. Сейчас вот только хочу разобраться с удалением. А так почти уже всё написал.
Да конечно кнопок не много но охото сразу привыкать к хорошему, компактному и эффективному коду,
не буду же я делать все 20 кнопок вручную.
А так вообщем можно накидать на ГУЮ контролов и готово, могу даже сейчас сделать, как вариант.
Вот код:
Заголовочный код:
[more]
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMainMenu *ShorCuts;
TMenuItem *Options1;
TMenuItem *NewButton1;
void __fastcall FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift);
void __fastcall Options1Click(TObject *Sender);
void __fastcall NewButton1Click(TObject *Sender);
private: // User declarations
public: int i; char Ch[100]; int Size; int ix; TButton* MyButton; // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall ButtonPressed(TObject *Sender);
};
[/more]
И код программы:
[more]
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
//---
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonPressed(TObject *Sender)
{
MyButton->Free();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Options1Click(TObject *Sender)
{
Options->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewButton1Click(TObject *Sender)
{
if (ix <= 18){
Form1->Focused();
Clipboard()->GetTextBuf(Ch, 100);
Clipboard()->SetTextBuf(Ch);
Clipboard()->Close();
TButton* MyButton = new TButton (Form1);
MyButton->OnClick = ButtonPressed;
MyButton->Width = 33;
MyButton->Height = 33;
MyButton->Top = 8;
MyButton->Left = i + 8;
MyButton->Hint = Ch;
MyButton->ShowHint = Ch;
MyButton->ComponentIndex = ix;
MyButton->Parent = Form1;
//ShowMessage(MyButton->ComponentIndex);
i += 35;
ix++;
}
}
[/more]
Вот уже что-то вырисовывается, конечно, я это всё изменю, подправлю дизайн, сделаю алгоритм по работе со строками что бы он делал интервалы. Как уже говорил оно будет менеджером буфера обмена, у меня идея уже возникла давно, из Космических Рейнджеров, в этой игре была панель где игрок хранил всяку информацию: типа там прайс-листы товаров, задания...Вот. У меня вот вобщем то только из-за этого появилось желание изучить C++,
и он мне стал нравится.
Я раньше скриптил в VBScript, AutoIt но там конечно нету таких возможностей, что и говорить.
Да и большущее спасибо вам ребята, за помощь Я вообще люблю этот форум, тут и помогут и пенделя конечно могут дать, но от этого он только становится лучше и информативнее.
RUBOARD fore4ver!!Остапа понесло...)
А ещё такой вопросик посоветуйте толковую книгу по BCB, что нибудь типа справочника, а то вся куча книг котороя у меня есть учит только кнопки рисовать.
Справочник Архангельского "Програмирование в Borland C++ Builder 6", в Е-буках я когда-то выкладывал (ссылка на пост h**p://forum.ru-board.com/topic.cgi?forum=93&topic=0488&start=180#5 ). Хорошая книга, куча справочного материала как ипо VCL,так и по C++.
а де FAQ? Можно в шапку вынести?
Updated Всё я разобрался!!
Вобщем я буду делать так: Form1->Controls[i]->Free();
--------------
Вобщем такая фигня, ни Show() не Hide() на кнопки не применяются. Только ShowMessage и другие функции которые не влияют на саму кнопку. Не знаю почему. Сейчас вот только хочу разобраться с удалением. А так почти уже всё написал.
Button1->Visible = false;
Вобщем я буду делать так: Form1->Controls[i]->Free();
--------------
Вобщем такая фигня, ни Show() не Hide() на кнопки не применяются. Только ShowMessage и другие функции которые не влияют на саму кнопку. Не знаю почему. Сейчас вот только хочу разобраться с удалением. А так почти уже всё написал.
Button1->Visible = false;
Приветствую, многознающих всех!
Кто работает в эхотаге с OpenGL???
Есть проблема, отрисовка по методам тов. Краснова, производится слишком медленно.
Кто-нить может что-либо посоветовать?
И есче: Кто-нить хоть как нибудь прикручивал библиотеку GLScene к С++ Builder 2006?
Кто работает в эхотаге с OpenGL???
Есть проблема, отрисовка по методам тов. Краснова, производится слишком медленно.
Кто-нить может что-либо посоветовать?
И есче: Кто-нить хоть как нибудь прикручивал библиотеку GLScene к С++ Builder 2006?
Когда компилирую файл на Си этим компилятором, то перед exe-файлом создается несколько промежуточных файлов: ilc .ild .obj .map. Как сделать чтобы они не создавались вообще или создавались в специально выделенной директории? Просто они мне мешают и приходится их каждый раз отделять от исходников с экзешками и удалять вручную.
Компилятор под XP.
IDE CodeBlocks
Компилятор под XP.
IDE CodeBlocks
artiyom
Цитата:
В свойствах проекта установить параметр Intermediate Output
Цитата:
Когда компилирую файл на Си этим компилятором, то перед exe-файлом создается несколько промежуточных файлов: ilc .ild .obj .map. Как сделать чтобы они не создавались вообще или создавались в специально выделенной директории? Просто они мне мешают и приходится их каждый раз отделять от исходников с экзешками и удалять вручную.
В свойствах проекта установить параметр Intermediate Output
Kott
А если программы пишуться не в рамках проекта а просто?
А если программы пишуться не в рамках проекта а просто?
artiyom, создай батник такого вида
Код:
@echo off
del *.~*
del *.bak
del *.obj
del *.tds
Код:
@echo off
del *.~*
del *.bak
del *.obj
del *.tds
помогите, пож, ато у меня уже мозги плавятся, прога не хочет пахать только изза одной хрени: не могу обьявить функции в классе TForm, компилятор ругается, что неразрешенное обьявление.
где их вообще обьявлять и как?
где их вообще обьявлять и как?
65daysofstatic
Мы не телепаты. Код в студию и выдели те части на которые ругается компилятор.
Мы не телепаты. Код в студию и выдели те части на которые ругается компилятор.
прога создает массив, вводимый целиком в edit на form1, сортирует его пузырьком по возрастанию или убыванию в зависимости от радикнопки. отсортировав, массив должен быть выведен на form2.
ENTR.cpp:
Код: //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ENTR.h"
#include "RSLT.h"
#include "Error.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try{
AnsiString text = Form1->Edit1->Text;
int i = 0, t = 0, k = 0, p = 0, l = text.Length();
for (i = 0; i < l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;} // - определение длины массива k
int *pMas;
pMas = new int[k]; // - динамическое обьявление массива длиной k
i = 0;
while (i < l) // заполнение массива
{
while ((text[i+t] != ',') || (text[i+t] != '.')) t++;
pMas[p] = text.SubString(i, i+t).ToInt();
p++;
i+=t;
t = 0;
}
if (Form1->RadioButton2->Checked == true) RVRS(pMas, k);
SORT(pMas, k); // - собственно сортировка
if (Form1->RadioButton2->Checked == true) RVRS(pMas, k);
Form2->Visible = true;
for (i = 0; i < k-1; i++) Form2->Edit1->Text += pMas[i] + ",";
Form2->Edit1->Text += ".";
}
catch (...) { Form3->Visible = true; }
}
//---------------------------------------------------------------------------
void TForm1::RVRS(int pMas[], int k)
{
for (int i = 0; i < k; i++) pMas[i] *= -1;
}
//---------------------------------------------------------------------------
void TForm1::SORT(int pMas[], int k)
{
int i = 0;
for (int s = 0; s < k-1; s++)
{
for (i; i < k-1; i++)
{
if (pMas[i] > pMas[i+1])
{
pMas[i] += pMas[i+1];
pMas[i+1] = pMas[i] - pMas[i+1];
pMas[i] = pMas[i] - pMas[i+1];
}
}
i = 0;
}
}
//---------------------------------------------------------------------------
void TForm1::DELT(int pMas[]) {delete pMas;}
//---------------------------------------------------------------------------
ENTR.cpp:
Код: //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ENTR.h"
#include "RSLT.h"
#include "Error.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try{
AnsiString text = Form1->Edit1->Text;
int i = 0, t = 0, k = 0, p = 0, l = text.Length();
for (i = 0; i < l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;} // - определение длины массива k
int *pMas;
pMas = new int[k]; // - динамическое обьявление массива длиной k
i = 0;
while (i < l) // заполнение массива
{
while ((text[i+t] != ',') || (text[i+t] != '.')) t++;
pMas[p] = text.SubString(i, i+t).ToInt();
p++;
i+=t;
t = 0;
}
if (Form1->RadioButton2->Checked == true) RVRS(pMas, k);
SORT(pMas, k); // - собственно сортировка
if (Form1->RadioButton2->Checked == true) RVRS(pMas, k);
Form2->Visible = true;
for (i = 0; i < k-1; i++) Form2->Edit1->Text += pMas[i] + ",";
Form2->Edit1->Text += ".";
}
catch (...) { Form3->Visible = true; }
}
//---------------------------------------------------------------------------
void TForm1::RVRS(int pMas[], int k)
{
for (int i = 0; i < k; i++) pMas[i] *= -1;
}
//---------------------------------------------------------------------------
void TForm1::SORT(int pMas[], int k)
{
int i = 0;
for (int s = 0; s < k-1; s++)
{
for (i; i < k-1; i++)
{
if (pMas[i] > pMas[i+1])
{
pMas[i] += pMas[i+1];
pMas[i+1] = pMas[i] - pMas[i+1];
pMas[i] = pMas[i] - pMas[i+1];
}
}
i = 0;
}
}
//---------------------------------------------------------------------------
void TForm1::DELT(int pMas[]) {delete pMas;}
//---------------------------------------------------------------------------
65daysofstatic
Билдер сначала валится здесь
for (i = 0; i < l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;}
из-за того, что считает элементы Ansistring c единицы
т.е. надо так
for (i = 1; i <= l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;}
в этом блоке не учитывается, что юзер может завести "1,2,3", т.е к=2 вместо к=3
но для примера можно всегда набирать запятую в конце - "1,2,3,"
Другие блоки тоже можно переделать из-за Ansistring...
Удачи.
Билдер сначала валится здесь
for (i = 0; i < l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;}
из-за того, что считает элементы Ansistring c единицы
т.е. надо так
for (i = 1; i <= l; i++) {if ((text[i] == ',') || (text [i] == '.')) k++;}
в этом блоке не учитывается, что юзер может завести "1,2,3", т.е к=2 вместо к=3
но для примера можно всегда набирать запятую в конце - "1,2,3,"
Другие блоки тоже можно переделать из-за Ansistring...
Удачи.
Garrett
спасибо, этот пункт исправили, но все-таки не изза этого глюк, там ошибка выскакивает раньше, чем происходит обращение к функции Button1Click. если трессировать, то сразу после нажатия выскакиевает эта ошибка, а потом уже генерируется исклбчение, там же стоит try-catch - если что-то после 'try{' и до '}' не получается сделать, то происходит то, что идет после 'catch(соответствующая ошибка) {' и до '}', в данном случае для любой ошибки выполняется catch(...)
спасибо, этот пункт исправили, но все-таки не изза этого глюк, там ошибка выскакивает раньше, чем происходит обращение к функции Button1Click. если трессировать, то сразу после нажатия выскакиевает эта ошибка, а потом уже генерируется исклбчение, там же стоит try-catch - если что-то после 'try{' и до '}' не получается сделать, то происходит то, что идет после 'catch(соответствующая ошибка) {' и до '}', в данном случае для любой ошибки выполняется catch(...)
65daysofstatic
Я сделал пример всавил твой код, и первой исключение появляется там где я сказал.
У бедиться очень просто. Перепиши свой код так
for (i = 0; i < l; i++) {
if ((text[i] == ',') || (text [i] == '.')) {
k++;
}
}
и запусти в отладчике. Исключение выйдет при попытке выполнения строки
if ((text[i] == ',') || (text [i] == '.')) {
а до неё компилятор дойдет нормально
PS. Советую вместо всяких массивов(простых и динамических) использовать вектора, списки, ассоциативные массивы, очереди.
Я сделал пример всавил твой код, и первой исключение появляется там где я сказал.
У бедиться очень просто. Перепиши свой код так
for (i = 0; i < l; i++) {
if ((text[i] == ',') || (text [i] == '.')) {
k++;
}
}
и запусти в отладчике. Исключение выйдет при попытке выполнения строки
if ((text[i] == ',') || (text [i] == '.')) {
а до неё компилятор дойдет нормально
PS. Советую вместо всяких массивов(простых и динамических) использовать вектора, списки, ассоциативные массивы, очереди.
добрый день, у меня такой вопрос:
как сделать так, чтобы перевод строки в поле Memo отображался корректно?
Т.е. есть текстовый файлик, куда после строки я добавляю например putc (s, fp), s- это char s='\n'; а когда пытаюсь вывести содержимое этого файла в Memo например вот так
Memo1->Lines->Add(str), где str - это строка которая предварительно считана из текстового файла, то в конце каждой строки печатается какая то закорючка, хотя перевод и происходит. Помогите советом плз
как сделать так, чтобы перевод строки в поле Memo отображался корректно?
Т.е. есть текстовый файлик, куда после строки я добавляю например putc (s, fp), s- это char s='\n'; а когда пытаюсь вывести содержимое этого файла в Memo например вот так
Memo1->Lines->Add(str), где str - это строка которая предварительно считана из текстового файла, то в конце каждой строки печатается какая то закорючка, хотя перевод и происходит. Помогите советом плз
этот косяк исправлен, на него, сосбстно никто и не ругался, ошибка все равно та же самая выскакиевает при таком раскладе вещей:
Код: /* while (i <= l)
{ while ((text[i+t] != ',') || (text[i+t] != '.')) t++;
*/
pMas[p] = text.SubString(i, i+t).ToInt();
/* p++; i+=t; t = 0;
} */
Код: /* while (i <= l)
{ while ((text[i+t] != ',') || (text[i+t] != '.')) t++;
*/
pMas[p] = text.SubString(i, i+t).ToInt();
/* p++; i+=t; t = 0;
} */
65daysofstatic
ну так i опять с нуля начинается...
ну так i опять с нуля начинается...
Garrett
нет, прямо перед этой строчкой было приравнивание i к нулю. фишка была в том, что условия нарасщивания t были заданы неверно, так получалось, что либо (text[i+t] != ','), либо (text[i+t] != '.') всегда верно.
потом:
pMas[p] = text.SubString(i, i+t).ToInt(); - тут неправильно фунция подстроки использована, вместо i+t надо писать t, вот и происходит запрос непонятно какого куска памяти.
прога почти заработала, осталось разобраться со значением, это вроде не сложно, у меня должно полчиться 0=Ъ
спасиба за помощь!
нет, прямо перед этой строчкой было приравнивание i к нулю. фишка была в том, что условия нарасщивания t были заданы неверно, так получалось, что либо (text[i+t] != ','), либо (text[i+t] != '.') всегда верно.
потом:
pMas[p] = text.SubString(i, i+t).ToInt(); - тут неправильно фунция подстроки использована, вместо i+t надо писать t, вот и происходит запрос непонятно какого куска памяти.
прога почти заработала, осталось разобраться со значением, это вроде не сложно, у меня должно полчиться 0=Ъ
спасиба за помощь!
65daysofstatic
спасибо, заработало
вот еще вопрос
нужно определить есть ли вхождение одной строки в другую, если есть то вывести на экран. Идея в том чтобы сначала привести эти стороки к верхнему регистру. Приведенный ниже код работает только для латинских символов, если строки содержат русскоязычные символы, то не работает. в чем может быть дело? может какие-нибудь функции посоветуете? спасибо.
if (strstr(UpperCase((AnsiString)str).c_str(), UpperCase(p->Text).c_str())!=NULL)
m->Lines->Text=m->Lines->Text+str;
спасибо, заработало
вот еще вопрос
нужно определить есть ли вхождение одной строки в другую, если есть то вывести на экран. Идея в том чтобы сначала привести эти стороки к верхнему регистру. Приведенный ниже код работает только для латинских символов, если строки содержат русскоязычные символы, то не работает. в чем может быть дело? может какие-нибудь функции посоветуете? спасибо.
if (strstr(UpperCase((AnsiString)str).c_str(), UpperCase(p->Text).c_str())!=NULL)
m->Lines->Text=m->Lines->Text+str;
diaz85, AnsiUpperCase тебе в помощь!
Tantos
Спасибо, помогло
Спасибо, помогло
Люди, такой вопрос: можно ли просто перекинуть библиотеку omp.h (параллельное программирование) из Visual Studio в Builder. И работать с ней как ни в чём не бывало? А то очень надо, а разбираться с VS не хочется.
C++Builer 2007 посоветуйте какой нибудь expert типа, VisualAssist X for VS.
(Особенно интересует - convert dot to -> опция).
(Особенно интересует - convert dot to -> опция).
Добрый вечер.
Интересует следущий вопрос
при получении информации ф-ей recv в Memo выводятся только первые четыре символа отправлееной строки + WinSock 2.0. Т.е. отправляем допустим asdfg получаем asdfWinSock 2.0. Если оправлять < четырех символов, то нормально. В чем может быть причина.
И еще следом, как сокет в асинхронный режим перевести?
Интересует следущий вопрос
при получении информации ф-ей recv в Memo выводятся только первые четыре символа отправлееной строки + WinSock 2.0. Т.е. отправляем допустим asdfg получаем asdfWinSock 2.0. Если оправлять < четырех символов, то нормально. В чем может быть причина.
И еще следом, как сокет в асинхронный режим перевести?
c++ помещает литералы до 4 байтов в регистры(передает как есть).
Для длинных строк надо выделять память и передавать(обрабатывать) указатель.
Для длинных строк надо выделять память и передавать(обрабатывать) указатель.
Недавно стал изучать C++(неделю), использую Borland 2006. Написал программку строк в десять (решение уравненений n-й степени). Все работает. Но размер консольного екзешника-287 кБайт. Это нормльно, или я неправильно скомпилировал и там чего-то лишнее?
Цитата:
или я неправильно скомпилировал и там чего-то лишнее?
Не нашел в твоем сообщении прикрепленного адреса телепатического канала.
Исходник нужен плюс твои настройки среды.
Цитата:
Не нашел в твоем сообщении прикрепленного адреса телепатического канала.
Исходник нужен плюс твои настройки среды.
Не думаю, что нужен исходник.
"Hello world!" имеет екзешник такого же размера. Подключается только <iostream>.
А вот настройки среды :
Project->Options->Linker -снята галка "Use dynamic RTL"
Project->Options->Packages - снята галка "Build with runtime packages"
Страницы: 12345678910111213141516171819202122232425262728
Предыдущая тема: ms exchange
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.