Page 1 of 212»

29th
Июл

Рассылка. Выпуск 69.

redaktor От ведущего.

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

(читать всё…)

28th
Июл

Как сделать экспорт ветки реестра?

Stilet:

Примерно так:
Код:

program Project1;

{$APPTYPE CONSOLE}

uses windows, SysUtils;
var hk:HKEY;
begin
   if RegOpenKey(HKEY_CURRENT_USER,’\Identities’,hk)=ERROR_SUCCESS then
     RegSaveKey(hk,’c:\temp\hk.reg’,nil);
   RegCloseKey(hk);
{ TODO -oUser -cConsole Main : Insert code here }
end.

Тема на форуме

27th
Июл

Как сделать общий доступ к папке в сети по паролю?

Sparky:

Вообщем вдруг кому-то пригодиться пишу что нужно сделать:
1. «Панели управления» и отмечаем чекбокс “Общий доступ к файлам и принтерам”
2. Воспользоваться компонентом “Одноранговая сеть”
3. включить “Служба общего доступа к файлам и принтерам”
4. выбрать Сетевой доступ: модель совместного доступа…”
5. отключить гостя
6. назначить права на доступ к папке, в доступе удалить “все”
7. на 2 машине в cmd ввести
Код:

net use x: \\имя_компа_где_лежит_папка\ имя_папки пароль_пользователя /user:имя_компа_где_лежит_папка\пользователь

Все

Тема на форуме

26th
Июл

Получить путь к исполняемому файлу включая имя исполняемого файла. [WPF]

String path = System.Reflection.Assembly.GetExecutingAssembly().Location;

Тема на форуме

26th

Обсуждаем оболочки С/С++

Tema_Crazzzy:

Доброго всем времени суток!
Я перепробовал кучу оболочек под С/С++ и остался доволен лишь парой, а скорее всего одним (Dev cpp) ….А какая оболочка по душе вам? И почему?

Интересная тема на форуме. Присоединится к обсуждению.

26th

Как сделать слежение за буфером обмена в Delphi?

SERG1980

Вообще есть готовые компоненты в RXLib и JEDI(JvClipBoadrMonitor,JvClipBoadr Viewer) н оесли сами хотите то вот вам пример
1.ZIP

Тема на форуме

25th
Июл

Как определить есть ли в строке цифра?

function IsNumber(s: string): Boolean;
var
   i, v: integer;
begin
   Val(s, v, i);
   IsNumber := (i=0);
end;

в VAL третий параметр для того, чтобы вернуть ошибочное начение – если он равен нулю, значит в s число, иначе – нет (в i величина смещения в стркое, где встретилась ошибка при попытке преобразовать строку в число).

Тема на форуме

25th

Как обработать данные с форм в php?

Johnatan:

if ($_GET['fid'] == 1) header(’Location: http://www.example.com/’);

или

switch ($_GET['fid']) {
case 1:
  header(’Location: http://www.example.com/’);
break;

case 2:
  header(’Location: http://www.example2.com/’);
break;

default:
  header(’Location: http://www.default.com/’);
}

Тема на форуме

24th
Июл

Как сделать чтобы TEdit стал браузерной строкой TWebBrowser?

Начинающий программист может столкнуться и с такой проблемой. Для этого у компонента TWebBrowser имеется свойство:

Webbrowser1.Navigate(edit1.text);

Тема на форуме

23rd
Июл

Как сделать Фоновое изображение в ListView?

Stilet:

Могу предложить такое:

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, Grids, StdCtrls, ComCtrls;

type
   TForm1 = class(TForm)
     ListView1: TListView;
     procedure FormCreate(Sender: TObject);
     procedure FormClose(Sender: TObject; var Action: TCloseAction);
     procedure ListView1CustomDrawItem(Sender: TCustomListView;
       Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var b:TBitmap;
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var e,i:integer;
begin
   b:=TBitmap.Create;
   b.LoadFromFile(’D:\stasya_ru_2_big.bmp’);
   for i:=1 to 100 do begin
     with ListView1.Items.Add do begin
       Caption:=TimeToStr(now);
       for e:=1 to 100 do SubItems.Add(TimeToStr(now));
     end;
   end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   b:=nil;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
   Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
const c=3;
var ARect:TRect;
begin
   DefaultDraw:=false;
   ARect:=Item.DisplayRect(drBounds);
   BitBlt(Sender.Canvas.Handle,ARect.Left+c,ARect.Top+c,ARect.Right-ARect.Left-c,
   ARect.Bottom-ARect.Top-c,b.Canvas.Handle,ARect.Left,ARect.Top,SRCCOPY);
end;

end.

Тема на форуме

23rd

Поиск и замена текста в файле?

Есть текстовый файл из 1000 строк. Там надо заменить слово “S1000″ на “S1200″, “Z100. на Z0.” , то есть многострочная замена.
Через что лучше и удобнее сделать такое?

var s:tstringlist;
begin
   s:=tstringlist.create;
   s.LoadFromFile(’файл’);
   s.text:=StringReplace(s.Text,’ S1000′,’ S1200′,[rfreplaceall]);
   s.SaveToFile(’файл’);
   FreeAndNil(s);
end.

Тема на форуме

23rd

Рассылка. Выпуск 68.

redaktor От ведущего.

Добрый день, дорогие читатели. Сегодня выходит 68 выпуск рассылки клуба.

И сегодня как обычно у нас интересные и полезные статьи и обзор тем форума программистов.

logo_grey

Новые интересные статьи клуба программистов.

Статьи на сайте клуба постоянно пополняются. Поэтому это постоянная и основная рубрика рассылки. Так же здесь обзор топиков форума и блога программистов.

Как получить слово под курсором с помощью делфи.

raxp:

пользуйте DirectUI

// перехват слова под курсором-
SetTimer(Handle, 1, 100, @RecalcText);

// слово под курсором-
procedure RecalcText(Wnd: HWND; uMsg, idEvent: UINT; dwTime: DWORD); stdcall;
var P: TPoint;
A: IAccessible;
V: Variant;
begin
if GetCursorPos(P) and ((P.X OldPoint.X) or (P.Y OldPoint.Y)) then begin
OldPoint:= P;
try
if Succeeded(AccessibleObjectFromPoint(P, A, V)) then
//sp.speeks(A.accName[V])
Caption := A.accName[V] + ‘ = ‘ + A.accValue[V]
else ;
except end
end
end;
подробнее на форуме

Fortress 2. Лучший бот. Этап второй

Не успел завершиться первый этап конкурса на создание лучшего бота, как начинается второй.
Ориентировочная дата второй битвы ботов 15 августа.

ОФИЦИАЛЬНЫЙ САЙТ КОНКУРСА

Все кто только присоединился могут почитать обсуждение первого этапа

Для тех кто только узнал об игре ключевые понятия игры.

Описание базовой версии игры для второго этапа.

Скачать Fortress 2 Build 2060 RC2

Принимается конструктивная критика, предложения по части баланса игры.
Если кому-то не нравится интерфейс игры, пишите в личку я дам исходники FortUI.dll.

Тема на форуме

Использование оператора goto в современных программах

Electron:

Можно ли при написании современных программ использовать оператор goto. И не могу понять почему все так избегают этот оператор как злую собаку. Все равно на низком уровне после дизассемблирования там же есть что то вроде jmp,jz,jnz(тоже goto). Так почему же на ЯВУ нельзя?

Присоединится к обсуждению

Универсальный совет для дизассемблирования

Это очень обширная тема, и, естесственно, не бывает универсальной методики, а бывают килограммы книг по дизассемблированию (копать в сторону Криса Касперски). Но вот есть что-то общее для этой темы:

Тема на форуме. Присоединиться к обсуждению.

Как установить принтер. WinApi и С++

Код:

TCHAR temp[MAX_PATH];
DWORD size = MAX_PATH;
GetDefaultPrinter(temp, &size);

HDC hDC = CreateDC(NULL, temp, NULL, NULL);

if(hDC){
  DOCINFO docinfo;
  docinfo.cbSize          = sizeof(docinfo);
  docinfo.lpszDocName = _T("Simple");
  docinfo.lpszOutput    = NULL:
  docinfo.lpszDatatype = _T("EMF");
  docinfo.fwType        = 0;

  if(StartDoc(hDC, &docinfo) > 0){
    if(StartPage(hDC) > 0){
      TextOut(hDC, ....);

      EndPage(hDC);
    }
    EndDoc(hDC);
  }

  DeleteDC(hDC);

Тема на форуме.

Перемещение TImage по форме. Как это сделать?

Описано два способа как это можно сделать. Достаточно подробно.

Тема на форуме

Delphi+MySQL. Какой компонент можно использовать?

MySQL Data Access Components v5.90.0.57 (Delphi 5-2010)

MySQL Data Access Components (MyDAC) – это расширенная библиотека VCL / VCL DOT NET / CLX компонентов для быстрого прямого доступа к серверам MySQL из Delphi, C++Builder и Kylix. MyDAC тщательно протестирован на производительность и стабильность для обеспечения наиболее быстрого соединения по сетевому протоколу с MySQL.

- Прямой доступ к данным сервера. Не требует установки других средств доступа к данным (таких как BDE и ODBC).
- В Direct режиме не требует клиента MySQL, а работает напрямую через TCP/IP.
- Полная поддержка последних версий MySQL и всех типов данных MySQL.
- Disconnected Model с автоматическим контролем соединения для работы с данными в режиме offline.
- Local Failover для обнаружения потери соединения и перевыполнения определенных операций.
- Все типы локальной сортировки и фильтрации.
- Автоматическое обновление данных с помощью компонентов TMyQuery, TMyTable и TMyStoredComponents.
- Поддержка Unicode и национальных кодировок.
- Поддержка специфических для MySQL типов данных и функций, таких как блокировка, типы данных SET и ENUM.
- Расширенная функциональность выполнения скриптов при помощи компонента TMyScript.
- Поддержка макроподстановок в текстах запросов.
- Интеграция с MySQL Developer Tools для решения сложных задач разработки и администрирования баз данных.
- Простая миграция с BDE с помощью Migration Wizard.

Тема на форуме

Gif анимация в delphi

Пример кода, как сделать так что бф в Delphi воспроизводилась gif анимация.

Тема на форуме

Как в Delphi сделать принтскрин и пережать в jpeg формат?

procedure GetRS(RS:TBitmap; Path: string);
var
c: TCanvas;
r: TRect;
jpgImg: TJPEGImage;
begin
c:=TCanvas.Create;
c.Handle:=getWindowDC(GetDesktopWindow);
try
r:=Rect(0,0,screen.Width,screen.Height);
RS.Width:=screen.Width;
RS.Height:=screen.Height;
RS.Canvas.CopyRect(r,c,r);
RS.SaveToFile(Path);
jpgImg := TJPEGImage.Create;
jpgImg.Assign(RS);
jpgImg.SaveToFile(Path)
finally
ReleaseDC(0,c.Handle);
c.Free;
jpgImg.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitMap;
begin
b:=TBitMap.Create;
GetRS(b,ExtractFilePath(Application.ExeName) + IntToStr(i) + ‘.jpg’);
b.Free;
Inc(i);
end;

Тема на форуме

Загрузка bmp в TImage на WinApi

Пример кода. Достаточно большой для публикации в рассылке.

Подробнее на форуме.

Как скомпилировать приложение под линукс из visual studio 2010

Ну, “писать кроссплатформеные приложения” можно хоть в блокноте. Если тебе удобнее делать это в студии – то делай это в студии. Нужно просто быть уверенным, что в твоём коде:

  • Не используются никакие расширения языка, введённые в Microsoft Visual C++, то бишь, проще говоря, твой код соответствует стандарту
  • Не используются вызовы WinAPI функций
  • Используются только кроссплатформенные библиотеки

Но скомпилировать,к примеру, linux-бианрник, при помощи студийного компилятора нельзя. Не поддерживает cl.exe компиляцию под другие платформы.

Если работать всё-таки ну ОЧЕНЬ хочется имено в студии, и при этом ну ОЧЕНЬ хочется собирать свой код под другие платформы не выходя из студии, то можно завести виртуалку с Linux`ом, поднять ssh-доступ в гостевой системе и написать скрипт, который будет передавать весь код в гостевую систему, запустит процесс компиляции, запишет сообщения об ошибках в лог и заберёт файл с логом. Ну а запуск этого скрипта можно повесить на кнопку на панели в Visual Studio. Таким образом ты сможешь вести всю разработку в Visual Studio, время от времени собирая свой код в другой систе
ме, чтобы убедиться, собирается ли код вообще).

Не идеальное решение. Следите за темой на форуме за дополнительными, более удобными способами.

На сайте клуба есть рубрики пост-обзор и топик-обзор клуба программистов.

ev

Немного юмора.

***

- Дорогой, ты знаешь, что мой гинеколог – мужчина? В каком-то смысле он
знает меня лучше, чем ты!
- Разумеется, ведь я – простой юзер, а он – сисадмин..

***

Заходит сисадмин в церковь и спрашивает у батюшки:
- На какую иконку у вас тут кликать, чтобы юзеры левые заряженные проги
на компы не ставили?
Батюшка отвечает:
- У нас не иконки, у нас образа, и не помогут они в такой печали.
Возвращайся в свой офис, сын мой, и кликай по образам юзеров.

***

Сын админа кричит:
- РОР3!
- Какой умный, в пять лет…
- Я покакал, поп три!

***

Sun.Zu: кстати, у меня бабушка – сисадмин
Sun.Zu: она периодически мимо комнаты проходит и спрашивает: “Митя?”
Sun.Zu: шоб узнать дома ли я
Sun.Zu: пингует )

***

Посетите раздел юмора на форуме, который обновляется постоянно

Читать этот номер в клубе.

23rd

Drag & Drop компоненты

mutabor:

Я тут расспрашивал вас о разных компонентах. Хочу тоже поделиться полезной информацией. Если кому нужны будут компоненты для перетаскивания, посмотрите на эти, очень хорошая вещь.

Тема на форуме

23rd

Как конвертировать *.bmp в *.ico.

Posted by bullvinkle under Исходники, Пост-обзор

Код:

……………………
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
BitBuf: TBitMap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
BitBuf:= TBitMap.Create;
BitBuf.LoadFromFile(’1.bmp’);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
BitBuf.SaveToFile(’1.ico’);
end;

end.

На форму “бросьте” кнопку Button1, в папку с проектом – файл BMP (как пример – 1.bmp) для преобразования в иконку (32 х 32 pixels).

Тема на форуме.

22nd
Июл

Парсер сайта на Делфи.

Грузим с сайта исходный код страницы, парсим объявление в коде, вносим в базу.


Вложения

Тип  файла: rar Parser.rar (7.5 Кб)

Тема на форуме.

20th
Июл

Загрузка bmp в TImage на WinApi

Код:

{
  Данный код был спроектирован в среде APIx - Visual WinAPI 2
  Copyright (c) PiddleSoft 2004-2006

http://piddlesoft.narod.ru

  piddlesoft@mail.ru

  Дата генерации листинга - 19.07.2010 16:05:36
}

program APIx_Project26;

uses
  windows, messages, commctrl; //Используемые модули

// Иконка
{$R 'icon.res'}

var
  WinClass : TWndClass; //переменная класса TWndClass для создания главного окна
  hInst : HWND; //хандлер приложения
  Handle : HWND; //локальный хандлер
  Msg : TMSG; //сообщение
  Bmp : HBITMAP;
  hFont : HWND; //хандлер шрифта
  Image1 : HWND; //TImage

{$R 'D:\_MainDir\APIx 2 - Visual WinAPI\temp\bitmaps.res'}
procedure ShutDown; //процедура завершения программы
begin
  DeleteObject(hFont); //удаление шрифта
  UnRegisterClass('TAPIxForm', hInst); //удаление окна
  ExitProcess(hInst); //закрытие программы
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
  Result := DefWindowProc(hwnd, msg, wparam, lparam);
  case Msg of

  WM_DESTROY: ShutDown;
  end;
end;

begin
hInst := GetModuleHandle(nil);
  with WinClass do
  begin
   Style := CS_PARENTDC; //стиль класса главного окна
   hIcon := LoadIcon(hInst, MAKEINTRESOURCE('APIXICON')); //иконка программы
   lpfnWndProc := @WindowProc; //назначение обработчика сообщений
   hInstance := hInst;
   hbrBackground := COLOR_BTNFACE + 1; //цвет окна
   lpszClassName := 'TAPIxForm'; //класс окна
   hCursor := LoadCursor(0, IDC_ARROW); //активный курсор
  end;
InitCommonControls;
RegisterClass(WinClass); //регистрация класса в системе

// Создание главного окна программы
Handle := CreateWindowEx(0, 'TAPIxForm', 'Форма1',
WS_OVERLAPPEDWINDOW or
WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,
219, 116, 550, 366,
0, 0,
hInst, nil);

// Создание шрифта
hFont := CreateFont(
-11, 0, 0, 0, 0, 0, 0, 0,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');

Image1 := CreateWindow(
'Static',
'' ,
WS_CHILD or SS_BITMAP or WS_VISIBLE,
104, 88, 225, 145, Handle, 0, hInst, nil);
SendMessage(Image1, WM_SETFONT, hFont, 0);
Bmp := LoadBitmap(hInstance, MAKEINTRESOURCE('Image1'));
SendMessage(Image1, STM_SETIMAGE, IMAGE_BITMAP, Bmp);

  // Цикл сбора сообщений
  while(GetMessage(Msg, 0, 0, 0)) do
  begin
    TranslateMessage(Msg); //прием сообщений
    DispatchMessage(Msg); //удаление сообщений из очереди
  end;
  end.

bmp – это HBitmap

Тема на форуме.

20th

Как в Delphi сделать принтскрин и пережать в jpeg формат?

procedure GetRS(RS:TBitmap; Path: string);
var
  c: TCanvas;
   r: TRect;
   jpgImg: TJPEGImage;
begin
   c:=Tc.Create;
   c.Handle:=getWindowDC(GetDesktopWindow);
   try
      r:=Rect(0,0,screen.Width,screen.Height);
      RS.Width:=screen.Width;
      RS.Height:=screen.Height;
      RS.Canvas.CopyRect(r,c,r);
      RS.SaveToFile(Path);
      jpgImg := TJPEGImage.Create;
      jpgImg.Assign(RS);
      jpgImg.SaveToFile(Path)
finally
      ReleaseDC(0,c.Handle);
      c.Free;
      jpgImg.Free;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   b: TBitMap;
begin
   b:=TBitMap.Create;
   GetRS(b,ExtractFilePath(Application.ExeName) + IntToStr(i) + ‘.jpg’);
   b.Free;
   Inc(i);
end;

Тема на форуме

19th
Июл

Универсальный совет для дизассемблирования

Это очень обширная тема, и, естесственно, не бывает универсальной методики, а бывают килограммы книг по дизассемблированию (копать в сторону Криса Касперски). Но вот есть что-то общее для этой темы:

Здравствуйте уважаемые формучане, есть проблемма с получением исходников из ехе приложения, упакован Armadilio, помогите советом, или прийдется позновать все тонкости дизассемблирования ((((….

Electron:

1) Открой прогу в PEID(можно скачать с www.cracklab.ru) и определи версию упаковщика Armadillo.
2) Распакуй(распаковщик для Armadillo на этом же сайте) свою прогу и еще раз
открой в PEID(или можно в EXEINFO) чтобы узнать на чем же писали и версию компилятора.
3) Если нужен диззассемблированный код открой в OllyDebuger v 1.10(не 2.0) или
IDA advanced pro и анализируй код до посинения.
4) Если нужен именно исходник то после определения на чем писалось и версии
компилятора делай так:
Если покажет Delphi то декомпилируй в DeDe
Если С++ то декомпилер от HexRays тебе в руки(кстати вместе с IDA как плугин
прикрепляют).
Если честно современными декомпиляторами можно получить многое о коде но не
все(Даже и не думай об обратной компиляции исходника полученного таким способом). Поэтому шоб получить читабельный компилябельный код надо хроршо
погимориться над этим.

Кстати еще можно попробовать SourceRescuer для декомпиляции С++ Builder

Тема на форуме. Присоединиться к обсуждению.

19th

Перемещение TImage по форме. Как это сделать?

dmitriegorovih:

Значит у меня Delphi 7
кидаем на форму image1 и кнопку, чтоб создавались image(ы)
во “всеобщий var” пишем следующие

var
  x2,y2,n:integer;
  nagata:boolean;

в обработчике onmousedown пишем следующие
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
   nagata:=true;
  x2:=x;
  y2:=y;
end;

в обработчике onMouseMove пишем следующие
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
   Y: Integer);
begin
  if nagata=true then begin
    if xx2 then begin
      Timage(sender).Left:=Timage(sender).Left+(x-x2)
    end;
    if yy2 then begin
      Timage(sender).Top:=Timage(sender).Top+(y-y2)
    end;
  end;
end;

в обработчике onMouseUp пишем следующие
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
  nagata:=false;
end;

по нажатию кнопки пишем следующие
procedure TForm1.Button1Click(Sender: TObject);
Var K:Timage;
Begin
  K:=Timage.create(self);
  k.parent:=self;
  k.picture:=image1.picture;
  k.onMouseMove:=image1.onMouseMove;
  k.onMouseDown:=image1. onMouseDown;
  k.onMouseUp:=image1.onMouseUp;
  k.name:=’Image_’+inttostr(n);
  inc(n);
end;

Ещё один способ:

Кидаем на форму TPanel На нее кидаем TImage, и расстягиваем Image на AlClient чтоб оно заполнило всю панель.
Далее в в обработчике зажатия мышки для Image пишем:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
const Sc_dragmove = $F012;
begin
   ReleaseCapture;
   Panel1.Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;

Тема на форуме

19th

Delphi+MySQL. Какой компонент можно использовать?

Posted by Chas under Пост-обзор

MySQL Data Access Components v5.90.0.57 (Delphi 5-2010)

MySQL Data Access Components (MyDAC) – это расширенная библиотека VCL / VCL DOT NET / CLX компонентов для быстрого прямого доступа к серверам MySQL из Delphi, C++Builder и Kylix. MyDAC тщательно протестирован на производительность и стабильность для обеспечения наиболее быстрого соединения по сетевому протоколу с MySQL.

- Прямой доступ к данным сервера. Не требует установки других средств доступа к данным (таких как BDE и ODBC).
- В Direct режиме не требует клиента MySQL, а работает напрямую через TCP/IP.
- Полная поддержка последних версий MySQL и всех типов данных MySQL.
- Disconnected Model с автоматическим контролем соединения для работы с данными в режиме offline.
- Local Failover для обнаружения потери соединения и перевыполнения определенных операций.
- Все типы локальной сортировки и фильтрации.
- Автоматическое обновление данных с помощью компонентов TMyQuery, TMyTable и TMyStoredComponents.
- Поддержка Unicode и национальных кодировок.
- Поддержка специфических для MySQL типов данных и функций, таких как блокировка, типы данных SET и ENUM.
- Расширенная функциональность выполнения скриптов при помощи компонента TMyScript.
- Поддержка макроподстановок в текстах запросов.
- Интеграция с MySQL Developer Tools для решения сложных задач разработки и администрирования баз данных.
- Простая миграция с BDE с помощью Migration Wizard.

Тема на форуме

19th

Как установить принтер. WinApi и С++

Код:

TCHAR temp[MAX_PATH];
DWORD size = MAX_PATH;
GetDefaultPrinter(temp, &size);

HDC hDC = CreateDC(NULL, temp, NULL, NULL);

if(hDC){
  DOCINFO docinfo;
  docinfo.cbSize          = sizeof(docinfo);
  docinfo.lpszDocName = _T("Simple");
  docinfo.lpszOutput    = NULL:
  docinfo.lpszDatatype = _T("EMF");
  docinfo.fwType        = 0;

  if(StartDoc(hDC, &docinfo) > 0){
    if(StartPage(hDC) > 0){
      TextOut(hDC, ....);

      EndPage(hDC);
    }
    EndDoc(hDC);
  }

  DeleteDC(hDC);

Тема на форуме.

18th
Июл

Использование оператора goto в современных программах

Electron:

Можно ли при написании современных программ использовать оператор goto. И не могу понять почему все так избегают этот оператор как злую собаку. Все равно на низком уровне после дизассемблирования там же есть что то вроде jmp,jz,jnz(тоже goto). Так почему же на ЯВУ нельзя?

Присоединится к обсуждению

15th
Июл

Рассылка. Выпуск 67.

Posted by Chas under Рассылка

redaktor От ведущего.

Добрый день, читатели рассылки. Сегодня выходит 67 выпуск рассылки, читайте в нём: (читать всё…)

14th
Июл

Энкодер датчика PDF на ПЛИС. Часть 1

аватар

Данная статья рассчитана в помощь программистам и инженерам-разработчикам в области промышленной автоматизации и АСУТП. Поскольку материал объемный, то было решено разделить статью на части, в первой рассмотрим схемотехнику и конструктив модулей передачи и приема сигналов с датчиков приращений, алгоритм работы энкодера, а в остальных – его реализацию на ПЛИС, методику программирования и непосредственно практическое создание тестовой утилиты визуализации состояний датчика приращений…

Сергей Бадло
by raxp http://raxp.radioliga.com

Каждый компонент системы не должен быть наилучшим, а ровно таким, чтобы обеспечить требуемый уровень функционирования всей системы… / принцип системотехники

Для передачи импульсных сигналов с датчика приращений на относительно большие расстояния в условиях промышленных помех можно использовать как радиоканал, так и проводной вариант*, к примеру, дифференциальные интерфейсы на основе RS- 485 и LVDS. Реализация радиоканала и RS-485 видится избыточной, так как необходимо наличие «упаковщика» как минимум трех сигналов с шифратора приращений (A, B и строба), т.е. наличие контроллера. Как обойти эту проблему?

Список сокращений, использованных в статье:
PDF – датчик углового положения,
EEPROM – перепрограммируемая ПЗУ,
ПЛИС – перепрограммируемые логические матрицы с сохранением памяти CPLD и без сохранения FPGA (работа схемы ограничивается наличием питающего напряжения),
ТИ – тактовые импульсы,
LVDS (Low-Voltage Differential Signaling) – интерфейс передачи информации дифференциальными сигналами малых напряжений,
Шифратор приращений – преобразователь, на выходе которого в цифровой форме представляются воспринимаемые ими перемещения. Различают* поворотные и абсолютные шифраторы.

Краткий экскурс…

Вспомним про формат LVDS. LVDS используется в таких компьютерных шинах как FireWire, USB 3.0, PCI Express, DVI, Serial ATA. Но среди прочего, данный интерфейс получил распространение и для передачи сигналов на больших скоростях на расстояния до сотни метров. Да, именно так, уже существуют и такие LVDS драйверы. Кроме того, сигналы с шифратора приращений необходимо декодировать и привести в удобоваримый вид. А значит, возникает необходимость создания аппаратного энкодера для определения таких параметров как: положение ротора, направление вращения, обрыв в канале и т.п.


рисунок 1

Рис. 1

Для реализации алгоритма энкодера видится два пути:

  1. Использование микроконтроллера
  2. Использование ПЛИС

Хороши оба варианта. Но для меня как разработчика более удобен вариант представления в виде схемы. Достоинства программируемых логических интегральных схем (ПЛИС) хорошо известны, это и наличие множества готовых библиотек от простейших логических элементов до микропроцессоров и возможность многократного перепрограммирования для изменения схемы, без внесения изменений в печать, и наличие си- подобного языка VHDL и возможность просто нарисовать поведение схемы. Хотя последние вряд-ли можно назвать преимуществами, так эти свойства присущи и микроконтроллерам…

Таким образом, задачу разработки энкодера для шифраторов приращений можно разбить на следующие этапы:

  1. Разработка модуля связи (передачи и приема) для передачи импульсных сигналов на большие расстояния в условиях промышленных помех
  2. Аппаратная реализация алгоритма энкодера на существующих ПЛИС
  3. Создание тестовой программы визуализации состояния датчиков приращений

Практика. Реализация модуля передачи и приема сигналов с шифратора приращений

Дифференциальный метод передачи используется в LVDS, поскольку обладает меньшей чувствительностью к общим помехам, чем простая однопроводная схема. Применение источников сигнала с дифференциальным токовым выходом и приемников с низкоомным дифференциальным входом (см. рисунок 2) обеспечивает минимальные индуктивные наводки, поскольку информация передается в форме тока, а емкостная наводка мала, так как при хорошей симметрии линии передачи она является синфазной и подавляется входным дифференциальным приемником. Дополнительной защитой линии является ее экранирование.

рисунок 2

Рис. 2. Канал передачи сигнала с помощью тока нечувствителен к индуктивным наводкам

Поскольку дифференциальные технологии, в том числе и LVDS, менее чувствительны к шумам, то в них возможно использование меньших перепадов напряжения, до 350 мВ. что позволяет по сравнению с другими способами передачи сигналов значительно снизить потребляемую мощность. Например, статическая мощность, рассеиваемая на нагрузочном резисторе LVDS, составляет всего 1.2 мВт, по сравнению с 90 мВт, рассеиваемыми на нагрузочном резисторе интерфейса RS-422. На рисунке 3 представлена схема организации канала связи между шифратором приращений и контроллером энкодера с использованием дифференциальных линий передачи:

* Комментарий автора.
Поворотные шифраторы – генерируют выходные импульсы, которые подсчитываются реверсивным счетчиком, поэтому их показания соответствуют тому, как далеко диск продвинулся с начала отсчета. Здесь в основном применяются два чувствительных элемента, расположенных в преобразователях таким образом, что их выходы сдвинуты относительно друг друга на 90° по фазе.


Абсолютные шифраторы – реализуют кодированный выход, который индицирует абсолютное положение контролируемого объекта, причем кодирование производится в двоичном коде, а его длина соответствует длине кода измерительной системы. Как правило, снабжены интерфейсами: SSI (Synchronous Serial Interface), СAN, PROFIBUS, RS-485.

** Комментарий редакции.
Следует упомянуть про параллельно-последовательные преобразователи со встроенным антидребезгом и нормализацией сигналов цифровых входов и преобразования их в единый поток данных, передаваемый по SPI интерфейсу. К примеру, ИМС SN65HVS88x от Texas Instruments. Однако это потребует минимум еще трех корпусов со стороны передатчика и приемника, что приведет к удорожанию модуля связи. Да и сам интерфейс SPI не предназначен для таких расстояний. Кроме того, существуют кодеры на основе сдвигающих регистров (НТ12Е/НТ12D или MC145026/28). Но их применение оправдано в случае использования радиоканала.


рисунок 3

Рис. 3. Схема организации канала передачи сигналов энкодера

Заданным условиям удовлетворяют нижеприведенные схемы (см. рисунок 4 и 5) на основе дифференциальных приемо-передатчиков сигнала LVDS формата SN65LVDS31 и SN65LVDS32 фирмы Texas Instruments [1].

Модуль связи энкодера конструктивно состоит из двух модулей: передачи и приема, разнесенных в пространстве. Модуль передачи размещается рядом с энкодером, а модуль приема непосредственно около контроллера энкодера.

Плата модуля передачи имеет в своем составе:

  • узлы согласования входного уровня для типов датчиков приращений с открытым коллектором или потенциальным выходом
  • узел формирования питающего напряжения 3.3В для ИМС дифференциального передатчика – U1
  • дифференциальный передатчик с согласующими сопротивлениями – U2
  • клеммник для подключения входных сигналов с датчика приращений – X1
  • клеммник выходных сигналов – X2

Плата модуля приема включает:

  • дифференциальный приемник с согласующими сопротивлениями – U1
  • узел формирования питающего напряжения 3.3В для ИМС дифференциального приемника с гальванической развязкой – U2
  • узлы согласования выходного уровня по типу СК или открытый коллектор
  • клеммник для подключения входных сигналов с линии связи – X1
  • клеммник выходных сигналов для энкодера – X2

Конструктив модуля связи

Платы модулей [3], габаритами 100х85 мм, выполнены из стеклотекстолита и разведены в пакете OrCad (см. рисунки 6 и 7). На плате передатчика перемычки X1…X4 (PLS-2) предназначены для конфигурации платы под датчики с открытым коллектором и потенциальным выходом. Суппрессоры D7…D10 служат для ограничения входных уровней и дополнительной защиты входных цепей микросхемы дифференциального передатчика U9. R21…R24 обеспечивают согласование длинной линии на основе витых пар***.


рисунок 4

Рис. 4. Схема электрическая принципиальная модуля передачи сигналов датчика приращений

На плате приемника предусмотрен вариант, как потенциальных выходов, так и с открытым коллектором. Для питания цепей приемника использован DC-DC преобразователь PUS-0505 (U5). Допустимо использование любого 5-вольтового в корпусе SIP мощностью не менее полуватта. Гальваническую развязку сигналов обеспечивают оптроны TLP621 (U2, U3, U4, U6). Предусмотрено питание схемы как от 5В, так и 24В источника. Элементы R1…R4 обеспечивают согласование длинной линии на основе витых пар. При необходимости инверсии выходных сигналов предусмотрена схема НЕ на ИМС SN74F04 (U10).


рисунок 5

Рис. 5. Схема электрическая принципиальная модуля приема сигналов датчика приращений

* Комментарий автора.
В качестве кабеля связи рекомендуется использовать следующие марки кабеля:
- FTP 4x2xAWG 24/1,
- S- FTP 4x2xAWG 24/1,
- S- STP 4x2xAWG 24/1.


рисунок 6

Рис. 6. Печатная плата “вид снизу” модуля передачи и приема (сверху-вниз)

Все резисторы, для упрощения разводки платы, корпусные. Конденсаторы типоразмера 0805. Используемые входные и выходные клеммники – WAGO 236-401 c защелками под отвертку. Платы установлены в корпуса из поликарбоната PHOENIX CONTACT с креплением на DIN рейку. Непосредственно габариты и вся конструкция в сборе представлена на рисунке 8.

Аппаратная часть. Краткое описание контроллера энкодера

Аппаратной основой энкодера датчика приращений служит модуль DIC110 (UNIOxx-5) фирмы Fastwell [2, 3], выполненный в формате MicroPC и установленный в 8-ми слотовое промышленное шасси на базе 486 процессора под управлением DOS. Шасси позволяет установку как ISA, так и PCI плат периферийного ввода-вывода.

Модули UNIOxx-5 имеют 5 разделяемых линий прерываний, канал прямого доступа к памяти (DMA) и светодиод обращения к плате. Внутренняя структура представлена на рисунке 9. Платы UNIO, в зависимости от загруженной прошивки, могут выполнять цифровой/частотный ввод-вывод, аналоговый ввод-вывод (через модули Grayhill), измерение частоты и многие другое. Прошивка изменяется программно, благодаря чему разработчики получают уникальную возможность решать с помощью одной платы множество задач. Если взглянуть на структуру, то сразу видно, что подобные возможности реализуются в основном благодаря наличию ПЛИС. Каждая матрица обслуживает 24 канала ввода-вывода. Загрузка схем матриц производится при включении питания или аппаратном сбросе (RESET) из электрически перепрограммируемого постоянного запоминающего устройства (EEPROM). Изменение варианта загружаемой схемы и, следовательно, способа обработки сигналов осуществляется перепрограммирова- нием EEPROM непосредственно в системе.


рисунок 7

Рис. 7. Расположение элементов “вид сверху и снизу” модуля передачи и приема (сверху-вниз)

рисунок 8

Рис. 8. Конструктив модуля передачи и приема импульсных сигналов


рисунок 9

Рис. 9. Структура модуля UNIOxx

Разработка ПО. Алгоритм энкодера

Итак, приступим к основной задаче. Для работы нам понадобится следующее:

  • Turbo C++ IDE ver.3.0 от Borland
  • IDE среда Xilinx Foundation Series 3.1i / 6.2i для ПЛИС [4]
  • Модуль передачи-приема импульсных сигналов датчика приращений
  • Промышленная плата UNIOxx-5 от Fastwell
  • JTAG.XILINX программатор из материала [5] или утилита внутреннего загрузчика ISP от FastWell [6]

Энкодер предназначен для декодирования сигналов угловых датчиков положения и передачи информации об угловом положении, скорости, направления вращения, количества оборо- тов, а также допол- ните- льных сигна- лов (в виде приз- наков отказа кана- лов, на- личия строба) в виде 8-ми разрядной цифровой последовательности для дальнейшей расшифровки программным путем.

Входные сигналы контроллера

Сигналы с каждого датчика шифратора приращений представляют последовательности импульсов, смещенных на 90 градусов по периоду следования. Частота следования импульсов определяет скорость вращения. Максимальная частота – 200 кГц. Максимальное количество импульсов за 1- оборот – 6000. Каждый оборот идентифицируется стробирующим импульсом. На рисунке 10 представлена последовательность импульсов от датчика, поступающих на вход контроллера:


рисунок 10

A – прямой и инверсный канал A,
B – прямой и инверсный канал B,
O – прямой и инверсный строб O (длительность равна четверти периодаимпульса по каналу А или В ±10%)
Рис. 10. Входные сигналы энкодера

Управляющие сигналы:

  • сигнал чтения READ по шине ISA платы UNIOxx-5
  • адресация (А0…А2) для организации чтения
  • (коммутации) 6-ти внутренних регистров тактовые импульсы (меандр) частотой 50 МГц от внешнего генератора платы UNIOxx-5

Выходные сигналы контроллера

Выходные сигналы для каждой микросхемы FPGA передаются по шине ISA в последовательности, описанной в таблице. Дальнейшая работа с шиной ISA определяется принципиальной схемой и протоколом обмена с микросхемами FPGA. Cформируем основные требования к энкодеру:

  • работоспособность при входных частотах канальных импульсов от 0.0 до 200 кГц
  • выставление бита направления вращения
  • запись данных в буферные регистры по поступлению: сигнала READ и опросе нулевого адреса из шины ISA, и хранение данных до поступления следующего сигнала READ
  • измерение количества импульсов, соответствующих угловому положению датчика и реверсом счетчика количества импульсов по направлению вращения
  • антидребезговый прием дискретных сигналов каналов (прямого и инверсного А, прямого и инверсного В)
  • динамическое изменение ширины защитного интервала для каждого из каналов в пределах длительности канального импульса;
  • хранение результата по предыдущему сигналу READ и выдачу текущего значения относительного углового положения, признаков канальных отказов, наличия строба, количества оборотов, относительной скорости
  • выдача должна осуществляться путем последовательного выбора (адресации по шине адреса А0…А3) внутренних регистров
  • хранения и записи в виде битовой последовательности DO0…DO7 по портам платы модуля UNIOxx-5

Теперь перейдем к программной части…

Скажем пару слов о среде САПР Xilinx****. Программные средства Xilinx Foundation представляют собой систему сквозного проектирования, которая реализует полный цикл разработки цифровых устройств на базе ПЛИС, включая программирование кристалла. Оболочка Project Navigator предоставляет пользователю интерфейс для работы с проектом и управления всеми процессами проектирования и программирования ПЛИС. Исходные описания проектируемых устройств могут быть представлены в текстовой форме с использованием языков HDL (Hardware Description Language), в виде диаграмм состояний или принципиальных схем. В состав пакета включен схемотехнический редактор и комплект библиотек.

Согласно спецификации на модуль UNIOxx-5 [2, 3], используются ПЛИС FPGA – XC5204. Теперь, запустив IDE Xilinx, создадим новый проект и выберем соответствующую матрицу (см. рисунок 11):

рисунок 11

Рис. 11. Создание проекта и выбор параметров в среде Xilinx

Заключение

Следует обратить ваше внимание, что при необходимости передачи импульсных сигналов с датчика приращений на расстояния более чем несколько сот метров (но менее километра), нужно использовать дифференциальные приемо- передатчики с драйверами предкоррекции сигналов и компенсацией потерь. В качестве таких приемо-передатчиков можно рекомендовать микросхемы LVDS CLC001 и CLC012 фирмы National Semiconductor [8, 9].

* Комментарий автора.
Если вы впервые столкнулись с данной средой, то сперва рекомендуется ознакомиться с кратким руководством [7] по работе с пакетом.

Ресурсы

Обсудить на форуме – Энкодер датчика PDF на ПЛИС. Часть 1

14th

Вывести набор случайных строк из бд? php

Johnatan

$amount = 10; // сколько строк выбирать из базы
$rows = mysql_result(mysql_query(’SELECT COUNT(*) FROM `sb_eng`’), 0);
$fquery = array();
while (count($fquery) < $amount) {
   $fquery[] = '(SELECT * FROM `sb_eng` LIMIT '.rand(, $rows).', 1)';
}
$query = implode(' UNION ', $fquery);
$res = mysql_query($query)

У тебя будет чистый набор рандомных строк из таблицы. Быстро и эффективно. Плюс не забываем про замечательную функцию mysql_fetch_assoc

Тема на форуме

14th

Gif анимация в delphi

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, GifImg, ExtCtrls;

type
   TForm30 = class(TForm)
     Image1: TImage;
     Timer1: TTimer;
     procedure Timer1Timer(Sender: TObject);
     procedure FormCreate(Sender: TObject);
   private
     Gif: TGifImage;
   public
     { Public declarations }
   end;

var
   Form30: TForm30;

implementation

{$R *.dfm}

procedure TForm30.FormCreate(Sender: TObject);
begin
   Gif := TGifImage.Create;
   Gif.LoadFromFile(’C:\Xom04.gif’);
   Gif.Animate := True;
   Gif.AnimateLoop := glEnabled;
end;

procedure TForm30.Timer1Timer(Sender: TObject);
begin
   Image1.Picture.Assign(Gif);
end;

end.

Тема на форуме

13th
Июл

Как в компоненте TWebbrowser убрать полосы прокрутки?

igh0st:

WebBrowser1.body.Style.overflow := “hidden”;

Тема на форуме

12th
Июл

Открывать файлы .txt с помощью своей программы

procedure TForm1.FormCreate(Sender : TObject);
var reg : TRegistry;
begin
   reg:=TRegistry.Create;
   Reg.RootKey:=HKEY_CLASSES_ROOT;
   reg.OpenKey(’.txt’, true);
   reg.WriteString(”,’txtfile’);
   reg.CloseKey;
   reg.CreateKey(’txt’+’DeDoK’;
   reg.OpenKey(’txtfile\DefaultIcon’, true);
   reg.WriteString(”,Application.ExeName+’,0′);
   reg.CloseKey;
   reg.OpenKey(’txtfile\shell\open\command’,true);
   reg.WriteString(”,Application.ExeName+’”%1″‘);
   reg.CloseKey;
   reg.Free;
end;

Тема на форуме

12th

Работа с MySQL в C++

Небольшая статья по взаимодействию с СУБД MySQL из программы на C++

автор статьи: psycho-coder
Тема на форуме

Немного теории

Код:
MYSQL mysql; // Дескриптор соединения. Структура, содержащая HANDLE для одного подключения к серверу.
MYSQL_RES *res; // Дескриптор результирующей таблицы
MYSQL_ROW row; // Массив полей текущей строки
MYSQL_FIELD *field; // Структура, которая содержит всю информацию, касающуюся отдельного поля таблицы

Функиции которые нам понабодятся:

Функция инициализации
  MYSQL *mysql_init(MYSQL *mysql);

Где соответственно host — компьютер, на котором запущена СУБД MySQL, user — имя юзера для подключения, passwd — пароль, db — название предполагаемой для использования базы данных, port — порт, unix_socket — сокет или pipe-канал, который необходимо использовать.

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)

client_ flag может принимать несколько значений:
CLIENT_COMPRESS — используется сжатие.
CLIENT_FOUND_ROWS — возвращать число найденных строк.
CLIENT_IGNORE_SPACE — делает все имена функций зарезервированными словами.
CLIENT_INTERACTIVE — разрешает interactive_timeout секунд бездействовать (вместо wait_timeout) перед закрытием подключения.
CLIENT_NO_SCHEMA — запрещает синтаксис вида “db_name.tbl_name.col_name” (имя_базы_данных.имя_таблицы.имя_ко лонки). Используется для ODBC.
CLIENT_ODBC — устанавливает то, что это клиент ODBC.
CLIENT_SSL — используется защищенный протокол SSL.

Мы флагами пользоваться не будем.

Функция выполняющая запрос
int mysql_query(MYSQL *mysql, const char *query);

Функция возвращяющая строку с описанием ошибки
Код:

char *mysql_error(MYSQL *mysql);

функция, которая получает все строки результата запроса и хранит их в буфере-клиенте
MYSQL_RES * mysql_store_result(MYSQL *mysql);

Получает количество строк в результате запроса
my_ulonglong mysql_num_rows(MYSQL_RES *res);

Получает количество полей (столбцов) в результате запроса
unsigned int mysql_num_fields(MYSQL_RES *res);

Заполняет массив полей для текущей строки
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

Заполняет структуру для текущего поля (fieldnr)
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *res, unsigned int fieldnr);

Начальная “настройка”

Для работы в Builder необходимо конвертировать libmysql.lib.
Для этого, нужно открыть консоль и набрать там это

C:\>”C:\Program Files\Borland\CBuilder6\Bin\coff2omf.exe”
-lib:st “C:\Program Files\Borland\CBuilder6\Lib\libmysql.lib”
“C:\Program Files\Borland\CBuilder6\Lib\libmysql_.lib”

Здесь “C:\Program Files\Borland\CBuilder6\Lib\libmysq l.lib” оригинальная библиотека,
а “C:\Program Files\Borland\CBuilder6\Lib\libmysq l_.lib” конвертированная

У каждого пути будут свои.
Также в папке с программой (или в “C:\Program Files\Borland\CBuilder6\Lib\”) должны быть libmysql_.lib, а для VS libmysql.dll.
Заголовочные файлы можно бросить в папку с программой или в “C:\Program Files\Borland\CBuilder6\Include\”.
Для VS “C:\Program Files\Microsoft Visual Studio Х.0\VC\include”. Где Х – версия VS.
В среде MS VC++ можно использовать библиотеку без конвертации, т.е. libmysql.lib.
Все заголовочные файлы могут быть в папке с программой, но тогда нужно подключать их локально.

Есть замечания для VC++ WinForms.
Так как типы String^ и char[] несовместимы, то для конвертирования из String^ в char[] можно использовать следующие функции (взято из MySQL++):

private: String^ ToUCS2(const char* utf8)
{
   try
   {
     return gcnew String(utf8, 0, strlen(utf8), System::Text::Encoding::Default);
   }
   catch(…)
   {
     return “”;
   }
}
private: Void ToUTF8(char* pcOut, int nOutLen, String^ sIn)
{
   try
   {
     array^ bytes = System::Text::Encoding::Default->GetBytes(sIn);
     nOutLen = Math::Min(nOutLen – 1, bytes->Length);
     System::Runtime::InteropServices::Marshal::Copy(bytes, 0, IntPtr(pcOut), nOutLen);
     pcOut[nOutLen] = ”;
   }
   catch (…)
   {
     pcOut[nOutLen] = ”;
   }
}

Пример использования
const int buf = 512;
char host[buf];
ToUTF8(host, buf, hostText->Text); // Перевод из String^ в char[]
String ^tmp = ToUCS2(mysql_error(&mysql)); // Перевод из char* в String^

Вот все необходимое для работы:
libmysql_lib.rar 2.5 кб
libmysql.lib.rar 5.1 кб
LibMySQL.dll.rar 447 кб
include.rar 73.7 кб

Вывод в консоль

Вывод таблиц в консоли. Интерфейс правда не супер, но для практики думаю хватит.
В коде есть комментарии. Если будут вопросы задавайте здесь

#define __LCC__ // Объявляем директиву без которой программа не может работать. Можно конечно поключить windows.h, но это будет не красиво

#pragma comment(lib, “libmysql_.lib”) // подключаем библиотеку
#include // Заголовочный файл с описание функций
#include
#include

void mysql(const char query[])
{
   MYSQL mysql; // Дескриптор соединения
   MYSQL_ROW row; // Массив полей текущей строки
   MYSQL_RES *res; // Дескриптор результирующей таблицы

   char host[] = “localhost”; // хост
   char user[] = “admin”; // пользователь
   char passwd[] = “admin”; // пароль
   char db[] = “library”; // название базы данных
   int port = 0; // порт. Если порт у сервера MySQL не по умолчанию (3306), то нужно указывать конкретный номер порта

   mysql_init(&mysql); // Инициализация
   mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0); // соединение

   if (mysql_query(&mysql, query) > 0) // запорс. Если ошибок нет, то продолжаем работу
   {

     // Если была ошибка, …
     printf(”%s”, mysql_error(&mysql)); // … вывдем ее
     return; // и завершим работу
   }

   res = mysql_store_result(&mysql); // Берем результат,
   int num_fields = mysql_num_fields(res); // количество полей
   int num_rows = mysql_num_rows(res); // и количество строк.

   for (int i = 0; i < num_fields; i++) // Выводим названия полей
   {
     field = mysql_fetch_field_direct(res, i); // Получение названия текущего поля
     printf(”| %s |”, field->name);
   }

   printf(”\n”);

   for (int i = 0; i < num_rows; i++) // Вывод таблицы
   {
     row = mysql_fetch_row(res); // получаем строку

     for (int l = 0; l < num_fields; l++)
       printf("| %s |", row[l]); // Выводим поля

     printf(”\n”);
   }

   printf(”Count records = %d”, num_rows); // Вывод информации о количестве записей
     mysql_free_result(res); // Очищаем результаты
     mysql_close(&mysql); // Закрываем соединение
}

int main()
{
   mysql(”SELECT * FROM t_mid_author”); // Запрос
   getch(); // Ожидаем нажатие клавиши
   return 0;
}

Графический интерфейс
Очередная статья по взаимодействию с СУБД MySQL из программы на С++
Мутим простейший интерфейс
рис 1

Кидаем на форму:
TLabel (5 шт.). В свойство Caption пишем хост, порт и т.д.
TEdit (5 шт.). Названия TEdit’ов: hostText, userText, passText, dbText и portText.
TButton (2 шт.). В свойства Caption пишем “Пошел!” и “Закрыть”.
TMemo (1 шт.)
TStringGrid (1 шт.)

Подключаем заголовочные файлы, библиотеку и объявим одну константу
#define __LCC__
#include
#pragma comment(lib, “libmysql_.lib”) // Для Builder 6. Подробней см. в первой статье
#pragma comment(lib, “libmysql.lib”) // Для MS VC++
// Для других сред программирования не пробовал
const int buf = 512;

Обработчик кнопки “Закрыть” думаю понятен

А в обработчик копки “Пошел!” пишем следующее
/* Проверим что все данные были введены? в.ч. и сам запос (Memo1) */
   if (hostText->Text.IsEmpty() || userText->Text.IsEmpty() ||
     passText->Text.IsEmpty() || dbText->Text.IsEmpty() ||
     portText->Text.IsEmpty() || Memo1->Text.IsEmpty())
   {
   MessageBox(this->Handle, “Не все поля заполнены!”, “Ошибка!”,
     MB_OK | MB_ICONERROR);
   return;
   }

// Тут Вам все должно быть знакомо
   MYSQL mysql;
   MYSQL_ROW row;
   MYSQL_RES *res;
   MYSQL_FIELD *field;

/* Объявляем массивы для работы */
   char host[buf];
   char user[buf];
   char passwd[buf];
   char db[buf];
   char query[buf];
   int port = portText->Text.ToInt();
   int num_fields = 0;
   int num_rows = 0;

/* Инициализируем имя хоста, пользователя, пароль и БД */
   strcpy(host, hostText->Text.c_str());
   strcpy(user, userText->Text.c_str());
   strcpy(db, dbText->Text.c_str());
   strcpy(passwd, passText->Text.c_str());
   strcpy(query, Memo1->Text.c_str()); //*/

   mysql_init(&mysql);
   if (!mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0))
   { /* Пробуем подключиться, если кдето ошибка то сообщим об этом */
     MessageBox(this->Handle, mysql_error(&mysql), “Error!”,
       MB_OK | MB_ICONERROR);
     return;
   }

   if (mysql_query(&mysql, query) > 0)
   { /* Пробуе выполнить запрос, если запрос не верен то сообщаем об ошибке,
   Выведем ее и выходим
   */
   MessageBox(this->Handle, mysql_error(&mysql), “Error!”,
     MB_OK | MB_ICONERROR);
   return;
   }

// Получаем результат
   res = mysql_store_result(&mysql);

   /* Устанавливаем кол-во строк в таблице и сохраняем кол-во строк */
   StringGrid1->RowCount = num_rows = mysql_num_rows(res);

/* Устанавливаем кол-во полей и сохраняем это кол-во столбцов */
   StringGrid1->ColCount = num_fields = mysql_num_fields(res);
   StringGrid1->FixedRows = 1; // Фиксируем первую строку.

   for (int i = 0; i < num_fields; i++) // Выводим названия полей
   {
     field = mysql_fetch_field_direct(res, i);
     StringGrid1->Cells[0] = field->name; // В первую строку, которую мы зафиксировали
   }

   for (int i = 1; i < num_rows; i++) // Вывод результата запроса
   {
     row = mysql_fetch_row(res); // Получаем строку
     for (int l = 0; l Cells[l] = row[l]; // Выводим строку по ячейкам
   }

   mysql_free_result(res); // Освобождаем память
   mysql_close(&mysql); // Закрываем соединение

Вот и все. пишем запрос и “Пошел!”.

Графический интерфейс. Специальный проект
Теперь напишем “специальный” клиент для базы данных Библиотека
Для начала создадим базу банных

# create.sql
# Создаем базу данных
CREATE database lib;

# Переключаемся на нее
use lib;

# Добавляем пользователя admin с паролем admin и связываем его с базой library
GRANT ALL ON lib.* TO ‘admin’@’%’ IDENTIFIED BY ‘admin’;

# Создаем таблицу книги
CREATE TABLE IF NOT EXISTS t_books
(
ID INT(6) UNSIGNED NOT NULL AUTO_INCREMENT,
Title CHAR(150) NOT NULL,
FIO CHAR(150) NOT NULL,
PRIMARY KEY(ID),
KEY(Title)
);

Интерфейс формы у меня получился такой.
рис 2

Компоненты:
TLabel и TEdit . по 5 штук, как из предыдущей статьи
ListBox – 1 шт список книг
GroupBox – 1 шт. В нем 2 TLabel и 2 TEdit, название книги и автор
TButton – 5 шт. Их желательно обозвать как у меня (Удалить, Изменить, Добавить, Подключиться, Закрыть).
BitBtn – 1 шт кнопка обновление данных.
TTimer – 1 шт проверка содинения.
Все подробности на скрине.

Объявляем необходимые переменные и подключаем все что нужно…

#define __LCC__
#pragma comment(lib, “libmysql_.lib”)
#include

const int buf = 512; // Буфер
bool connected = false; // Есть соединение или нет
int *arrIDs = NULL; // Массив идентификаторов
int ID = 0; // Идентификатор текущей книги
MYSQL mysql; // Дескриптор соединения
MYSQL_RES *res; // Структура результатов
MYSQL_ROW row; // Массив строк результата

/* Объявляем массивы для работы */
char host[buf];
char user[buf];
char passwd[buf];
char db[buf];
int port = 0;

Настройки таймера:
Enabled := false; // Выключен
Interval := 5000; // 5 секунд

Код обработчика таймера:
if (mysql_ping(&mysql) > 0) // Если соединение разорвано…
{
   connected = false; // ставим флаг дисконнекта
   if (arrIDs) delete []arrIDs; // Очищаем массив
   Timer1->Enabled = false; // … выключаем таймер
   MessageBox(this->Handle, “Соединение с сервером потеряно”, “Ошибка!”,
     MB_OK | MB_ICONERROR); // Выведем сообщение лоб этом
   Button5->Click(); // Запустим повторное соединение
}

Далее обработчики кнопок

Код кнопки “Подключиться”

// Подключение
if (connected) return; // Если уже соединены, то выходим.
/* Проверим, что все данные были введены */
if (hostText->Text.IsEmpty() || userText->Text.IsEmpty() ||
passText->Text.IsEmpty() || dbText->Text.IsEmpty() ||
portText->Text.IsEmpty())
{
MessageBox(this->Handle, “Не все поля заполнены!”, “Ошибка!”,
MB_OK | MB_ICONERROR);
return;
}

/* Инициализируем имя хоста, пользователя, пароль, порт и БД */
strcpy(host, hostText->Text.c_str());
strcpy(user, userText->Text.c_str());
strcpy(db, dbText->Text.c_str());
strcpy(passwd, passText->Text.c_str());
port = portText->Text.ToInt();

mysql_init(&mysql); // Инициализация дескриптора
if (!mysql_real_connect(&mysql, host, user, passwd, db, port, NULL, 0))
{ /* Пробуем подключиться, если кде-то ошибка, то сообщим об этом */
MessageBox(this->Handle, mysql_error(&mysql), “Error!”,
MB_OK | MB_ICONERROR);
return;
}

connected = true; // Соединены
Timer1->Enabled = true; // Порверка соединения каждые 5 сек.
BitBtn1->Click(); // Обновить список

Код кнопки “Обновить” (BitBtn1)

// Обновление списка книг
if (!connected) return; // Если соединения нет, то выходим

/* Так как, мы знаем что нам нужно, то и запрос будет статическим.
Получим названия всех книг и идентификаторов, потом заполним ими ListBox
Сортируем в порядке возрастания по названию книги */

if (mysql_query(&mysql, “SELECT ID, Title FROM t_books ORDER BY Title”) > 0)
{ // Проверка на ошибки
MessageBox(this->Handle, mysql_error(&mysql), “Ошибка!”,
MB_OK | MB_ICONERROR);
return;
}

ListBox1->Clear(); // Очистка списка.
if (arrIDs) delete []arrIDs; // Очистка массива

// Заполняем структуру
res = mysql_store_result(&mysql);
// Получаем количество записей
int count = mysql_num_rows(res); // Получаем количество строк
arrIDs = new int[count]; // Инициализируем массив

for (int i = 0; i < count; i++)
{
// Полчаем строку
row = mysql_fetch_row(res);
// Заполняем массив
arrIDs = StrToInt(row[0]);
// Добавляем в ListBox название книги
ListBox1->Items->Add(row[1]);
}

mysql_free_result(res); // Освобождаем ресурсы

Графический интерфейс. Специальный проект. Продолжение

Код кнопки “Добавить”

// Добавление книг
// Если соединения нет или поля ввода пустые, то выходим

   if (!connected && (bookText->Text.IsEmpty() || authorText->Text.IsEmpty()))
     return;

// Формируем запрос на добавление книги
   AnsiString tmp = “INSERT INTO t_books (ID, Title, FIO) VALUES (NULL,\
     ‘” + bookText->Text + “‘, ‘” + authorText->Text + “‘)”;

   char query[buf]; // Переменная дла запроса
   strcpy(query, tmp.c_str()); // Ковертируем в нужный формат.

// Запрос. Если ошибки есть, то выводим их и выходим из функции
   if (mysql_query(&mysql, query) > 0)
   {
     MessageBox(this->Handle, mysql_error(&mysql), “Ошибка!”,
       MB_OK | MB_ICONERROR);
     return;
   }

   // Вывод сообщения о том, что все хорошо.
   MessageBox(this->Handle, “Книга добавлена!”, “”, MB_OK | MB_ICONINFORMATION);
   bookText->Clear();
   authorText->Clear();
   BitBtn1->Click(); // Обновим данные

Код кнопки “Изменить”

   // Изменение книг
   // Если соединения нет и книга не выбрана, то выходим

   if (!connected && ID < 1) return;

   AnsiString tmp = “UPDATE t_books SET Title = ‘” + bookText->Text +”‘,\
     FIO = ‘” + authorText->Text + “‘ WHERE ID = ” + IntToStr(ID);

   char query[buf];
   strcpy(query, tmp.c_str());

   if (mysql_query(&mysql, query) > 0)
   {
     MessageBox(this->Handle, mysql_error(&mysql), “Ошибка!”,
       MB_OK | MB_ICONERROR);
   return;
   }

   MessageBox(this->Handle, “Информация о книге обновлена”, “”,
     MB_OK | MB_ICONINFORMATION);

Код кнопки “Удалить”

   // Удаление книг
   // Если соединения нет и нет выделенной книги для удаления, то выходим

   if (!connected && ID < 1) return;

   // Подтверждение удаления
   if (MessageBox(this->Handle, “Удалить?”, “Удаление”,
     MB_YESNO | MB_ICONQUESTION) != 6) return;

   // Формируем запрос на удаление
   AnsiString tmp = “DELETE FROM t_books WHERE ID = ” + IntToStr(ID);
   char query[buf];
   // Приводим его
   strcpy(query, tmp.c_str());

   // Выполняем.
   if (mysql_query(&mysql, query) > 0)
   {
     MessageBox(this->Handle, mysql_error(&mysql), “Ошибка!”,
       MB_OK | MB_ICONERROR);
     return;
   }

   MessageBox(this->Handle, “Книга удалена”, “”, MB_OK | MB_ICONINFORMATION);
   BitBtn1->Click();

Выбор книги из ListBox будет производится по двойному щелчку

   // Выбор книги
   // Если соединения нет, то выходим

   if (!connected) return;

   // Тут надеюсь все понятно. Если нет, смотрите “Обновление списка”
   AnsiString tmp = “SELECT FIO FROM t_books WHERE ID = ”
     + IntToStr(arrIDs[ListBox1->ItemIndex]);

   char query[buf];
   strcpy(query, tmp.c_str());

   if (mysql_query(&mysql, query) > 0)
   {
     MessageBox(this->Handle, mysql_error(&mysql), “Ошибка!”,
     MB_OK | MB_ICONERROR);
     return;
   }

   // Получаем результаты
   res = mysql_store_result(&mysql);
   row = mysql_fetch_row(res);

   // Получаем идентификатор книги
   ID = arrIDs[ListBox1->ItemIndex];

   // Выводим название книги
   bookText->Text = ListBox1->Items->Strings[ListBox1->ItemIndex];
   // Выводим автора
   authorText->Text = row[0];
   mysql_free_result(res);

И, по закрытию программы написать

   // Закрытие программы
   // Если соединены, то разрываем соединение.

   if (connected)
   {
     mysql_close(&mysql);
     if (arrIDs) delete []arrIDs;
   }

все исходники статьи и скрипт sql
Вся статья (сделана под форум). В аттаче.
mysql.txt

Обсудить на форуме – Работа с MySQL в C++

11th
Июл

Программа для получения данных об устройствах ПК

[MoNAMur]:

отрыл у себя на компьютере в папке “раритет” эти исходники.

интересно ваше мнение по поводу кода и полезности программы)))
да и может кому то понадобится какой-нибудь кусок кода.

программа получает данные о некоторых железках…

Исходник программы
Тема на форуме

Page 1 of 212»



Облако меток

процессы паскаль Fortress дата и время bmp Edit мультимедиа конкурс шифрование функция регулярные выражения строки Топик-обзор папка MySQL игры word поиск Image delphibasics ListBox assembler си шарп алгоритмы StringGrid canvas база данных форма html сеть функции компоненты indy ассемблер memo советы программы php Файлы графика макросы Win Api office мысли C/C++ winapi excel интернет журнал ПРОграммист Delphi