Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 4)

Автор: linker_2009
Дата сообщения: 01.11.2010 12:52
Vital283
Value:=<YourcxGridDBTableView>.Controller.FocusedRow.Values[<columname>.IndexID];

Автор: marser
Дата сообщения: 01.11.2010 12:56
Vital283
cxGridDBColumn.EditValue
Автор: mdid
Дата сообщения: 01.11.2010 15:05
народ подскажите плз как менять скины в риббоне(53 девы)? в стилях есть куча скинов и в дизайн тайме все выбираются и все красиво...а вот прога компиллится с голубым...как установить скин не из тройки стандартных?
Автор: linker_2009
Дата сообщения: 01.11.2010 16:12
mdid
А dxRibbon1.ColorSchemeName:=<название_скина> не катит?
Автор: mdid
Дата сообщения: 01.11.2010 16:15
неа..то есть катит только для трех стандартных(Silver,Black,Blue)...а другие в рантайме меняются на блу
Автор: linker_2009
Дата сообщения: 01.11.2010 16:36
mdid
Если решишь или не решишь проблему - отпишись пожалуйста. А то может и не стойт переходить на 53.
Автор: asi81
Дата сообщения: 01.11.2010 17:43
Добрый день!
Если в CxGridView() человек редактирует какую либо запись - какой нужно вызвать метод, чтобы отменить его редактирование, и при этом не срабатывали события OnValidate()?
Автор: f3ka
Дата сообщения: 01.11.2010 17:47
asi81
может у датасета вызвать CANCEL?
Автор: asi81
Дата сообщения: 01.11.2010 18:40
f3ka
Было бы логично, но почемуто OnValidate() все равно срабатывает
нашел такой способ
Edit = dynamic_cast<TcxCustomTextEdit*>(MainGrid->Controller->EditingController->Edit);
if (Edit)
Edit->Undo();
Автор: jukol
Дата сообщения: 01.11.2010 22:11
vladman

Цитата:
тогда давайте код показывающий как создаете, как уничтожаете. Посмотрим.

Я сделал упрощенный тестовый проект. На форме динамически создаю три кнопки.
После клика по первой кнопке в памяти создается база данных с одной тестовой таблицей.
Количество записей в таблице регулируется константой RecCount. После клика по второй кнопке
динамически создается TcxGrid, в котором отображается тестовая таблица. Третья кнопка
предназначена для удаления созданного grid. Если записей достаточно много, например, 5 тыс.,
то программа при этом заметно "задумывается". Если же записей около 50 тыс. (как у меня на самом деле), то программа "висит" несколько минут. Исходные файлы H и CPP хоть и небольшие, но для форума великоваты. Может быть выслать Вам на e-mail? Или выложить на какой-либо файлообменник?
Автор: vladman
Дата сообщения: 02.11.2010 01:15
jukol

Цитата:
Может быть выслать Вам на e-mail? Или выложить на какой-либо файлообменник?

Как вам будет удобней. Но также можно воспользоваться тэгом more (http://i.ru-board.com/codes.html) или ПМ.

Добавлено:
asi81

Цитата:
Если в CxGridView() человек редактирует какую либо запись - какой нужно вызвать метод, чтобы отменить его редактирование, и при этом не срабатывали события OnValidate()?

Странно, что это событие у вас вообще возникает в вашем случае, так как

Цитата:
The event OnValidate is generated:
1) when moving focus to another control;
2) when pressing the Enter key if the ValidateOnEnter property is set to True.
Автор: jukol
Дата сообщения: 02.11.2010 09:02
vladman

Цитата:
Как вам будет удобней. Но также можно воспользоваться тэгом more (http://i.ru-board.com/codes.html) или ПМ.


Попробую воспользоваться тэгом more.
Это файл Main.h
[more]
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "edbcomps.hpp"
#include "cxGrid.hpp"
#include "cxGridCustomTableView.hpp"
#include "cxGridCustomView.hpp"
#include "cxGridDBTableView.hpp"
#include "cxGridLevel.hpp"
#include "cxGridTableView.hpp"
//---------------------------------------------------------------------------
class TMainForm : public TForm
{
__published:    // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private:    // User declarations
TPanel* MyPanel;
TButton* MyBtnCreateBase;
TButton* MyBtnCreateGrid;
TButton* MyBtnRemoveGrid;
TEDBEngine* MyEngine;
TEDBSession* MySession;
TEDBDatabase* MyBase;
TEDBTable* MyTable;
TDataSource* MyDataSource;
TcxGrid* grid;

private:
void __fastcall MyEngineBeforeStart(TObject *Sender);
void __fastcall MyBtnCreateBaseClick(TObject *Sender);
void __fastcall MyBtnCreateGridClick(TObject *Sender);
void __fastcall MyBtnRemoveGridClick(TObject *Sender);

public:        // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TMainForm *MainForm;
//---------------------------------------------------------------------------
#endif
[/more]

А это файл Main.cpp
[more]
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
const int RecCount=5000;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner)
{
MyEngine=NULL;
MySession=NULL;
MyBase=NULL;
MyTable=NULL;
MyDataSource=NULL;
grid=NULL;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
WindowState=wsMaximized;

// Create controls
MyPanel=new TPanel(this);
MyPanel->Parent=this;
MyPanel->Height=45;
MyPanel->Align=alBottom;

MyBtnCreateBase=new TButton(MyPanel);
MyBtnCreateBase->Parent=MyPanel;
MyBtnCreateBase->Width=250;
MyBtnCreateBase->Left=10;
MyBtnCreateBase->Top=10;
MyBtnCreateBase->Caption="Create database and TestTable";
MyBtnCreateBase->OnClick=MyBtnCreateBaseClick;

MyBtnCreateGrid=new TButton(MyPanel);
MyBtnCreateGrid->Parent=MyPanel;
MyBtnCreateGrid->Width=250;
MyBtnCreateGrid->Left=270;
MyBtnCreateGrid->Top=10;
MyBtnCreateGrid->Caption="Create TcxGrid and show TestTable";
MyBtnCreateGrid->OnClick=MyBtnCreateGridClick;

MyBtnRemoveGrid=new TButton(MyPanel);
MyBtnRemoveGrid->Parent=MyPanel;
MyBtnRemoveGrid->Width=250;
MyBtnRemoveGrid->Left=530;
MyBtnRemoveGrid->Top=10;
MyBtnRemoveGrid->Caption="Remove TcxGrid";
MyBtnRemoveGrid->OnClick=MyBtnRemoveGridClick;

// Create empty data directory
String DataPath=Sysutils::ExtractFilePath(Application->ExeName)+"Data\\";
if(DirectoryExists(DataPath))
{
// Remove not empty directory
SHFILEOPSTRUCT sh;
sh.hwnd=Handle;
sh.wFunc = FO_DELETE;
sh.pFrom = DataPath.t_str();
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation(&sh);
}
CreateDirectory(DataPath.t_str(),NULL);

// Create ElevateDB engine
MyEngine=new TEDBEngine(this);
MyEngine->ConfigPath=DataPath;
MyEngine->BeforeStart=MyEngineBeforeStart;
MyEngine->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
if(grid) delete grid;
if(MyDataSource) delete MyDataSource;

if(MyTable)
{
MyTable->Active=false;
delete MyTable;
}

if(MyBase)
{
MyBase->Connected=false;
delete MyBase;
}

if(MySession) delete MySession;

if(MyEngine)
{
MyEngine->Active=false;
delete MyEngine;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MyEngineBeforeStart(TObject *Sender)
{
MySession=MyEngine->FindSession("Default");
if(MySession)
{
MySession->LoginUser="Administrator";
MySession->LoginPassword="EDBDefault";
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MyBtnCreateBaseClick(TObject *Sender)
{
// Create base in memory
String BaseName="Test";
String BaseDesc="Test database";

String sql;
sql.printf(L"CREATE DATABASE \"%s\" IN MEMORY DESCRIPTION '%s'",BaseName,BaseDesc);
TEDBQuery* query=new TEDBQuery(this);
query->DatabaseName="Configuration";
query->SQL->Text=sql;
query->ExecSQL();
delete query;

MyBase=new TEDBDatabase(this);
MyBase->Database=BaseName;
MyBase->DatabaseName=BaseName;

// Create TestTable
String s,FldName,TableName="TestTable";
int FldCount=30,FldWidth=32;
int FldCount1=FldCount-1;
    sql.printf(L"CREATE TABLE %s (",TableName);
for(int i=0;i<FldCount;i++)
{
FldName.printf(L"Field%02d",i);
s.printf(L"%s VARCHAR(%d)",FldName,FldWidth);
if(i<FldCount1) s+=",";
sql+=s;
}
    sql+=")";
    MyBase->Execute(sql);

// Fill TestTable
sql.printf(L"INSERT INTO %s VALUES (",TableName);
for(int i=0;i<FldCount;i++)
{
s.printf(L"'value for field %02d'",i);
if(i<FldCount1) s+=",";
sql+=s;
}
sql+=")";

for(int i=0;i<RecCount;i++)
{
s.printf(L"Add record: %d of %d",i+1,RecCount);
Caption=s;
MyBase->Execute(sql);
}
ShowMessage(L"TestTable is filled!");
s.printf(L"TestTable: RecCount=%d",RecCount);
Caption=s;

// Open TestTable
MyTable=new TEDBTable(this);
MyTable->DatabaseName=BaseName;
MyTable->TableName=TableName;
MyTable->Active=true;

// Create DataSource
MyDataSource=new TDataSource(this);
MyDataSource->DataSet=MyTable;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MyBtnCreateGridClick(TObject *Sender)
{
// Create and tune grid
grid=new TcxGrid(this);
grid->Parent=this;
grid->Align=alClient;

TcxGridLevel* level=grid->Levels->Add();
TcxGridDBTableView* view=(TcxGridDBTableView*)grid->CreateView(__classid(TcxGridDBTableView));
level->GridView=view;
view->FilterBox->CustomizeDialog=true;
view->FilterBox->Position=fpBottom;
view->FilterBox->Visible=fvAlways;

view->OptionsBehavior->GoToNextCellOnEnter=true;
view->OptionsBehavior->IncSearch=true;
view->OptionsBehavior->NavigatorHints=true;

view->OptionsCustomize->ColumnsQuickCustomization=true;

view->OptionsView->CellEndEllipsis=true;
view->OptionsView->Footer=true;
view->OptionsView->HeaderEndEllipsis=true;
view->OptionsView->Indicator=true;
view->OptionsView->Navigator=true;
view->OptionsView->ShowColumnFilterButtons=sfbAlways;

view->DataController->DataSource=MyDataSource;
view->DataController->CreateAllItems();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::MyBtnRemoveGridClick(TObject *Sender)
{
if(grid)
{
grid->BeginUpdate(); // don't help
MyTable->DisableControls(); // don't help

TcxGridLevel* level=grid->Levels->Items[0];
level->Active=false; // don't help

TcxGridDBTableView* view=(TcxGridDBTableView*)level->GridView;
view->ClearItems(); // don't help
view->DataController->DataSource->DataSet=NULL; // don't help
view->DataController->DataSource=NULL; // don't help

MyTable->Close(); // don't help

grid->EndUpdate(); // don't help
delete grid;
grid=NULL;
Repaint();
}
}
//---------------------------------------------------------------------------
[/more]
Неужели для таблицы с большим числом записей удаление TcxGrid требует много времени?
Пробовал для базы, размещенной в памяти и на диске.
Что я делаю не так?
Автор: Man_Without_Face
Дата сообщения: 02.11.2010 10:09
Подскажите можно ли записать cxImage в memorystream:
var tempstream : TMemoryStream;

cxImageTop.picture.savetostream(tempStream); //что то вроде такого (но такого нету)
qOrgAdd.ParamByName('InList').LoadFromStream(TempStream, ftBlob);

delphi 2009, DevExpress 52.
Автор: linker_2009
Дата сообщения: 02.11.2010 10:53
Man_Without_Face

cxImage1.Picture.Bitmap.SaveToStream();
или
cxImage1.Picture.Icon.SaveToStream();
или юзать TcxDBImage
Автор: Man_Without_Face
Дата сообщения: 02.11.2010 11:03
linker_2009
Ok, спасибо.
А такое пойдет?: cxImageTop.picture.graphic.SaveToStream(tempStream);
Автор: vladman
Дата сообщения: 02.11.2010 11:26
jukol

Цитата:
Неужели для таблицы с большим числом записей удаление TcxGrid требует много времени?

50 тыс и несколько минут - нет, это неверное поведение, но с вашим кодом вроде бы все в порядке.

Для выяснения причин попробуйте поэкспериментировать еще с такими вещами.
- в качестве базы данных попробуйте использовать другую, не TEDBEngine
- попробуйте не создавать все динамически, а сделать все в дизайнтайме и посмотреть время закрытия приложения в таком случае.
Автор: linker_2009
Дата сообщения: 02.11.2010 11:37
Man_Without_Face

Цитата:
А такое пойдет?: cxImageTop.picture.graphic.SaveToStream(tempStream);

Можно и так. Я использую <YourcxImage>.Picture.Bitmap.SaveToStream(); универсальнее если бд потом использовать в другом приложении
Автор: Man_Without_Face
Дата сообщения: 02.11.2010 12:15
linker_2009
Что то ничего не получается:

делаю запись в Sybase 8 (поля long binary) через tQuery
[more]
insert into berlio.berlio_cards (cards_id, org_name, first_cards_number, last_cards_number,
             cards_counter, cards_image_top, cards_image_bottom)

values (:cards_id, rg_name, :first_cards_number, :last_cards_number,
             :cards_counter, :cards_image_top, :cards_image_bottom)
[/more]
[more]
TempStream := TMemoryStream.Create;
cxImageTop.picture.graphic.SaveToStream(tempStream); //загружены jpg'и
qOrgAdd.ParamByName('cards_image_top').LoadFromStream(TempStream, ftBlob);
cxImageBottom.picture.graphic.SaveToStream(tempStream);
qOrgAdd.ParamByName('cards_image_bottom').LoadFromStream(TempStream, ftBlob);
[/more]
В базе получаются записи в обоих полях - 0x3f3f3f3f3f (раньше никогда с long binary не работал)
//////////////////////////////////////////////////////////////////////////////////////////////////////
читаю через tQuery (select * from berlio.berlio_cards), в query оба поля объявлены как ftBlob:
[more]
procedure TfrmMain.FormShow(Sender: TObject);
begin
qOrgView.Close;
qOrgView.Open;
qOrgView.first;

TempStream := TMemoryStream.Create;

qOrgViewcards_image_top.SaveToStream(TempStream); //или так
TBlobField(qOrgView.FieldByName('cards_image_top')).SaveToStream(TempStream); // или так
cxImageTop.picture.graphic.LoadFromStream(tempStream); //Тут access violation

tempstream.SaveToFile('D:\image1.jpg'); //Если записать в файл, то файл пустой.
end;
[/more]
cxImageTop.picture.graphic.SaveToStream(tempStream);
менял на
cxImageTop.picture.bitmap.SaveToStream(tempStream);
тоже самое

Автор: linker_2009
Дата сообщения: 02.11.2010 13:54
Man_Without_Face
Попрбуй после ...SaveToStream(tempStream); сделать tempStream.seek(0,0); и после чтения из поля( TBlobField(qOrgView.FieldByName('cards_image_top')).SaveToStream(TempStream);) в поток тоже tempStream.seek(0,0); Сори я тебе конкретно сказать как сделать сейчас не могу, исходников с этим моментом при себе нет.
А чем тебя TcxDBImage не устраивает?
Автор: Man_Without_Face
Дата сообщения: 02.11.2010 14:01
linker_2009 ок, спс попробую позже.

Цитата:
А чем тебя TcxDBImage не устраивает?

пример есть с его использованием? я так понимаю там дата контроллер настроить надо? да и в sybase какой тип поля ставить? (есть image).
Автор: linker_2009
Дата сообщения: 02.11.2010 14:12
Man_Without_Face
у TcxDBImage в DataBinding выставляешь в Datasource - датасет, В DataField - поле в котором хранить рисунок и в Properties.GraphicClassName - Выставляешь нужный формат. Все, никаких телодвижений не нужно больше. Загружать и сохранять картинки в файл так же как с TcxImage
Автор: Man_Without_Face
Дата сообщения: 02.11.2010 16:29
linker_2009
Что то как не крути - пусто в cxImage или cxDBImage. Уже все перепробовал. Такое ощущение что запись неправильно делаю в базу!?
Автор: vladman
Дата сообщения: 02.11.2010 18:28
Man_Without_Face

Цитата:
Что то как не крути - пусто в cxImage или cxDBImage. Уже все перепробовал. Такое ощущение что запись неправильно делаю в базу!?

Какую базу и какие компоненты доступа к ней используете?
Не обратил внимания на ваш пост на прошлой странице. Sybase и TQuery. Верно?
Автор: vladman
Дата сообщения: 03.11.2010 01:16
Man_Without_Face

Цитата:
Такое ощущение что запись неправильно делаю в базу!?

При записи попробуйте также тайпкастить поле к TBlobField.
Также у TcxDBImage есть встроенное Popup Menu (управляется свойством Properties.PopupMenuLayout.MenuItems) попробуйте воспользоваться им для сохранения имэджа в базу.
Автор: Man_Without_Face
Дата сообщения: 03.11.2010 10:35
vladman
спасибо, вопрос снят, пойду другим путем.


Автор: FunCode
Дата сообщения: 04.11.2010 09:16
вчера столкнулся с таким глюком - TcxDBLookupComboBox, в Properties установил ImmediatePost, и обрабатываю OnValidate. Так вот, есть все-таки способ обойти Validate - начинаем набирать текст (DropDownStyle = EditFixedList) - потом нажимаем Tab ... и успешно минуя проверку оказываемся на соседнем контроле, при этом в TcxDBLookupComboBox новое значение, если потом щелкнуть мышью в него, то сразу будет старое значение - походу при Tab они EditValue не меняют а вот текст забывают синхронизировать. Потом выставил PostPopupValueOnTab = True - так стало лучше, т.е. при Tab к старому значению не откатываемся, а пытаемся применить новое - соответственно происходит Validate и никаких глюков с прорисовкой ...
Автор: Man_Without_Face
Дата сообщения: 04.11.2010 11:52
Как узнать загружен рисунок в cxImage или нет?
cxImage.isLoading не подходит. Спасибо.
Автор: MagistrAnatol
Дата сообщения: 04.11.2010 13:14
народ, помогите разобраться - есть грид 6,53 - один столбец имеет свойство СпинЕдит-
мне надо при его изминении заполнить другое поле -
использую свойства PropertiesEditValueChanged и PropertiesChanged -
поле в котором надо установить значение меняятся - а в изминяемом поле не могу ввести значение если использувать бутоны спина, а если руками ввожу - значение пропадает -
шо за хрень??

Добавлено:
да и ещо для грида использую запрос из двух таблиц
SELECT
a.OCT_TMZ_NAKL_ID,
a.OCT_TMZ_MAIN_ID,
a.SPR_OPER_ID,
a.SPR_PLAN_ID,
a.KODTMZ,
a.VID_KOGO,
a.KOMY,
a.SPR_TOVAR_ID,
b.EDIZM,
b.ZINA,
a.KOLVO,
a.CYMA,
a.PODOTCHETNIU,
a.VIDPOVIDALNIU,
a.OCT_TMZ_DVIG
FROM
OCT_TMZ_DVIG a
left join SPR_TOVAR b on a.SPR_TOVAR_ID=b.SPR_TOVAR_ID
where a.OCT_TMZ_NAKL_ID=:OCT_TMZ_NAKL_ID
при добавлении новой записи и и установке a.SPR_TOVAR_ID я не вижу значений
b.EDIZM,
b.ZINA,

?????

Добавлено:
рефреш такой
SELECT
a.OCT_TMZ_NAKL_ID,
a.OCT_TMZ_MAIN_ID,
a.SPR_OPER_ID,
a.SPR_PLAN_ID,
a.KODTMZ,
a.VID_KOGO,
a.KOMY,
a.SPR_TOVAR_ID,
b.EDIZM,
b.ZINA,
a.KOLVO,
a.CYMA,
a.PODOTCHETNIU,
a.VIDPOVIDALNIU,
a.OCT_TMZ_DVIG
FROM
OCT_TMZ_DVIG a
left join SPR_TOVAR b on a.SPR_TOVAR_ID=b.SPR_TOVAR_ID
where( a.OCT_TMZ_NAKL_ID=:OCT_TMZ_NAKL_ID
) and ( A.OCT_TMZ_DVIG = LD_OCT_TMZ_DVIG
)

a.SPR_TOVAR_ID - ЕксЛукапКомбоБокс
использую файребирд и фибсы
Автор: makz
Дата сообщения: 04.11.2010 14:36
MagistrAnatol
select есть, а где update и insert?
Автор: MagistrAnatol
Дата сообщения: 04.11.2010 15:02
makz


INSERT INTO OCT_TMZ_DVIG(
OCT_TMZ_NAKL_ID,
OCT_TMZ_MAIN_ID,
SPR_OPER_ID,
SPR_PLAN_ID,
KODTMZ,
VID_KOGO,
KOMY,
SPR_TOVAR_ID,
KOLVO,
CYMA,
PODOTCHETNIU,
VIDPOVIDALNIU,
OCT_TMZ_DVIG
)
VALUES(
-- CT_TMZ_NAKL_ID,
gen_id(gen_oct_tmz_nakl_id,0),
CT_TMZ_MAIN_ID,
:SPR_OPER_ID,
:SPR_PLAN_ID,
:KODTMZ,
:VID_KOGO,
:KOMY,
:SPR_TOVAR_ID,
:KOLVO,
:CYMA,
ODOTCHETNIU,
:VIDPOVIDALNIU,
CT_TMZ_DVIG
)


UPDATE OCT_TMZ_DVIG
SET
OCT_TMZ_NAKL_ID = CT_TMZ_NAKL_ID,
OCT_TMZ_MAIN_ID = CT_TMZ_MAIN_ID,
SPR_OPER_ID = :SPR_OPER_ID,
SPR_PLAN_ID = :SPR_PLAN_ID,
KODTMZ = :KODTMZ,
VID_KOGO = :VID_KOGO,
KOMY = :KOMY,
SPR_TOVAR_ID = :SPR_TOVAR_ID,
KOLVO = :KOLVO,
CYMA = :CYMA,
PODOTCHETNIU = ODOTCHETNIU,
VIDPOVIDALNIU = :VIDPOVIDALNIU
WHERE
OCT_TMZ_DVIG = LD_OCT_TMZ_DVIG




Добавлено:
makz

меня больше интерисует на данный момент почему не меняется значение колонки

Добавлено:
и как сделать чтобы в гриде по енреру передвигался курсор на следующую колонку?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.