Я разрабатываю в C ++ Builder с V3. Большая часть моей работы была сделана в V5 и V6. Я только сейчас возвращаюсь к нему через несколько лет, пробуя издание сообщества и 64-битный мир. Он использует только стандартные элементы управления Windows (TEdit, tbutton , tcheckbox` и т. Д.) и одно управление сокетом. Это менее 400 строк кода в одной форме Windows. Что я могу сделать, чтобы уменьшить это? Это кажется абсурдно для меня большим для меня, потому что это такое. Выполняемый файл составляет 540 кб в V6. Я не ожидал более 17 МБ для того же кода в текущей версии.#ifndef formMainH
#define formMainH
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
class TfMain : public TForm
{
__published: // IDE-managed Components
TEdit *eScan;
TComboBox *cbPrinter;
TSpeedButton *bClear;
TLabel *lDecoded;
TCheckBox *ckAutoPrint;
TBitBtn *bPrint;
TBitBtn *bClose;
TLabel *lScan;
TLabel *lDecode;
TLabel *lPrinter;
TLabel *lPrinterIPAddress;
TClientSocket *Sock;
int __fastcall isCPSBarcode(AnsiString Str);
int __fastcall isIPAddress(AnsiString Str);
void __fastcall bCloseClick(TObject *Sender);
void __fastcall FormShow(TObject *Sender);
void __fastcall cbPrinterSelect(TObject *Sender);
void __fastcall eScanChange(TObject *Sender);
void __fastcall bPrintClick(TObject *Sender);
void __fastcall SockConnect(TObject *Sender, TCustomWinSocket *Socket);
void __fastcall SockDisconnect(TObject *Sender, TCustomWinSocket *Socket);
void __fastcall eScanKeyPress(TObject *Sender, System::WideChar &Key);
void __fastcall bClearClick(TObject *Sender);
void __fastcall SockError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // User declarations
TStringList *printerNames;
TStringList *printerIPAddresses;
AnsiString selectedIPAddress;
AnsiString defaultPrinter;
public: // User declarations
__fastcall TfMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TfMain *fMain;
//---------------------------------------------------------------------------
#endif
< /code>
formmain.cpp
#include
#pragma hdrstop
#include "formMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfMain *fMain;
//---------------------------------------------------------------------------
__fastcall TfMain::TfMain(TComponent* Owner) : TForm(Owner)
{
printerNames = new TStringList;
printerIPAddresses = new TStringList;
}
//---------------------------------------------------------------------------
void __fastcall TfMain::FormShow(TObject *Sender)
{
AnsiString thisPort("");
AnsiString defaultPrinter("");
int defaultPrinterIdx = -1;
TRegistry *Reg = new TRegistry;
// Get network printer names and IP addresses from Windows registry
// Locally connected printers are skipped since we will be using a TCP
// socket to communicate with the printer
Reg->RootKey = HKEY_LOCAL_MACHINE;
if(Reg->OpenKeyReadOnly("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers")){
Reg->GetKeyNames(printerNames);
Reg->CloseKey();
for(int i = 0; i < printerNames->Count; i++){
if(Reg->OpenKeyReadOnly(
"\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\"
+ printerNames->Strings)){
thisPort = Reg->ReadString("Port");
if(isIPAddress(thisPort)){
cbPrinter->Items->Add(printerNames->Strings);
printerIPAddresses->Add(thisPort);
}
Reg->CloseKey();
}
}
}
else{
if(Application->MessageBox(L"Unable to open registry!",L"Error",MB_OK))
Close();
}
delete Reg;
// Get default printer from last run
Reg = new TRegistry;
if(Reg->OpenKey("\\SOFTWARE\\TCC\\BinLabelShrink", true)){
if(Reg->ValueExists("DefaultPrinter"))
defaultPrinter = Reg->ReadString("DefaultPrinter");
if(Reg->ValueExists("AutoPrint"))
ckAutoPrint->Checked = Reg->ReadBool("AutoPrint");
if(defaultPrinter.Length())
for(int i = 0; i < cbPrinter->Items->Count; i++)
if(cbPrinter->Items->Strings == defaultPrinter)
defaultPrinterIdx = i;
if(defaultPrinterIdx > -1){
cbPrinter->ItemIndex = defaultPrinterIdx;
cbPrinterSelect(cbPrinter);
}
else if(Reg->ValueExists("DefaultPrinter")) // The defaultPrinter wasn't found, so clear it
Reg->WriteString("DefaultPrinter","");
Reg->CloseKey();
}
delete Reg;
}
//---------------------------------------------------------------------------
void __fastcall TfMain::bCloseClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfMain::cbPrinterSelect(TObject *Sender)
{
selectedIPAddress = printerIPAddresses->Strings[((TCustomCombo*)Sender)->ItemIndex];
lPrinterIPAddress->Caption = selectedIPAddress;
if(isCPSBarcode(eScan->Text))
bPrint->Enabled = true;
eScan->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TfMain::eScanChange(TObject *Sender)
{
int strLen;
int semiColonIdx;
int dashIdx;
AnsiString fullStr;
// Sample scan string "A:19:18:1;0-12680bB"
Sleep(100);
if(eScan->Text[eScan->Text.Length()] == ' '){
eScan->Text = eScan->Text.TrimRight();
eScan->SelStart = eScan->Text.Length();
eScan->SelLength = 0;
}
if(isCPSBarcode(eScan->Text)){
eScan->Font->Style = TFontStyles() ItemIndex > -1){
bPrint->Enabled = true;
if(ckAutoPrint->Checked) // Fire off print if we're on auto
bPrintClick(this);
}
}
else{
if(eScan->Text.Length()){
eScan->Color = clWindow;
eScan->Font->Color = clWindowText;
eScan->Font->Style = TFontStyles();
if(eScan->Text.Pos("
Подробнее здесь: https://stackoverflow.com/questions/796 ... le-so-huge
Новый 64-разрядный Dev (старый 32-битный DEV): Почему мой 64-битный исполняемый файл такой огромный? [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение