1 de 7
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
Inicio
Contctenos
Qu es DatoSoft
Descargas
Ir a otros temas...
CONTENIDO
09/01/2015 12:53 a. m.
2 de 7
Trabajar con objetos dinmicos tiene una ventaja cuando no se desea que
el constructor sea invocado en el punto h al declarar la variable, ejemplo:
TPermisos Permisos vs TPermisos *Permisos
Si el incremental linker se queda pegado, revisar en opciones del
proyecto, las rutas de los directorios de las lib y los nclude. Quitar la de c:\
si aparece
Note: Placing datasets (and data sources) directly on forms is
recommended only for very simple database applications. Even for
moderately simple database applications that only work with a few tables
or queries on a few forms, using a DATA MODULE eases development
and maintenance.
Cadenas en C++ Builder:
1. Estn las tradicionales del c: char Cadena[20];
2. La clase standar del C++: string;
3. Las nuevas cadenas largas del Pascal: AnsiString que se redefine como
typedef AnsiString String en sysdefs.h. Son las que se utilizan en todos los
componentes visuales de la vcl. AnsiString es una clase que soporta el
operador + para concatenar.
4. Para arreglos, TStringList, en vcl\classes.hpp
5. Las wchar para manejar UNICODE
Para colocar una cadena que en medio tenga un carcter como \x14 (20
decimal):
Lista->Add("5011 187018E41401003\x14""5012 187203");
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
Filtros
Para colocar filtros que dependan de edits, combobox etc.:
Answer:
(1) Delete the *.il? in the project
DBGrids
Un DBGrid es una simple ventana cuyas celdas se dibujan, la celda no es
un TControl ni nada por el estilo, ver los ejemplos pruebas\dbgrid) y se v
que para dibujar simplemente se usa el canvas del grid.
Seguramente que al momento de escribir se crea un edit para capturarlo
unicamente.
Para colocarle la flechita abajo o el boton con ... en una columna toca con
el editor de columnas aadir la del caso y ya sea colocarle
en la propiedad picklist las que deseamos que aparezcan o en el butonstyle
colocar ellipse y definir un evento tal (estando ahi
pulsar la ayuda).
09/01/2015 12:53 a. m.
3 de 7
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
/*
Para crear accesos directos en el men del botn inicio,
void __fastcall TFrmGrabarNotas::DBGrid1KeyDown(TObject *Sender, WORD&Key,An se sigue utilizando DDE para conversar con el Program
TShiftState Shift)
{
Manager.
// Para desactivar Ctrl-Suprimir en el grid.
La VCL tiene un componente que encapsula el inicio y final de la
if (Key==VK_DELETE && Shift.Contains(ssCtrl))
conversacin: TDdeClientConv
Key=NULL;
Basta colocarle en las propiedades, DdeService y DdeTopic,
else if (Key==VK_DOWN && Query1->RecNo==LastRecord)
Key= NULL;
"program" en cada uno, y luego DdeClientConv1}
>ExecuteMacro("[CreateGroup(tigre2)][AddItem(e:\\ut
\\fconvert.exe,ivan)
]",
Para poder tener campos de diferentes tablas en un mismo dbgrid, debe
false))
colocarse asociado al grid una TTable con caractersticas muy especiales:
Ve en Pruebas, PrDde
Primero debe ser un campo aadido con fields editor (boton derecho en
*/
ttable) usando new field y no add fields
keyFields= IUsuario (Contenido en table1 a buscar en la otra)
LookUpDataSet=Table2 (Tiene a IUsuario y a NUsuario, con llave
IUsuario)
LookKeyFields=IUsuario (Campo a buscar en la tabla 2 que case con
keyfield)
LookUpResultField=NUsuario (Campo a devolver de la tabla 2)
LookUp=True
No se requiere colocar propiedades de lookup en la tabla, ni se requiere
indexado, pero con ste funciona mas rpido
Estos campos solo son de lectura y deben definirse en el evento
OnCalcFields.
Si se quiere que aparezca el valor tomado de otra tabla debe ser un lookup,
que tambien queda de solo lectura.
Si se quiere mostrar un valor en el campo, pero que no sea calculado ni
lookup,de modo que se pueda cambiar, debe colocarse un evento en el
DBGrid en OnColEnter, que asigne al campo el valor de la otra tabla, (no
se puede en el OnCalcFields porque se produce StackOverFlow), tal como
ocurre en kardex,
ej:
/*
Para detener una instruccion for, while etc.
Para permitir que un botn Cancelar acte y detenga un ciclo, debe
colocarse dentro del ciclo: Application->ProcessMessages();
Y El cdigo asociado al botn debe ser colocar una variable a false,
variable que debe ser una de las condiciones del ciclo, por supuesto.
No funciona colocar PostQuitMessage() o Close() en el cdigo
asociado al click del boton, porque regresa al ciclo y contina dando
vueltas.
if (DbGridFact->SelectedField->FieldName=="ENTRADAS") {
Para posicionarse al inicio de un TMemo
if (DataModule1->Art->Locate("CodiArti",
Memo1->SelStart=0; {
DataModule1->MovTemp->FieldByName("CodiArti")->AsString, TLocateOptions()))
DataModule1->MovTemp->Edit();
Memo1->SelLength = 0;
DataModule1->MovTemp->FieldValues["Valor"]
Memo1->Perform(EM_SCROLLCARET,
=DataModule1->Art->FieldValues["ValoComp"];
Memo1->SetFocus();
}
}
0, 0);
09/01/2015 12:53 a. m.
4 de 7
Pero para que esto realmente se tome el dato entrado en la tabla toca en el
evento OnColEnter del grid, colocar:
CodiArti=DataModule1->MovTemp->FieldByName("CodiArti")->AsString;
DataModule1->MovTemp->FieldValues["CodiArti"]=CodiArti.UpperCase();
La clave para que no se mueva el grid en las validaciones y en los for
recorriendo la tabla, es desconectar el grid del datasource en los procesos y
justo antes de que se vuelva a visualizar volverlo a conectar.
Una manera de hacerlo es con DataSet->DisableControls, por ejemplo si el
dataset es un Query1: (Ver agua Reporte para lecturas)
Query1->DisableControls();
FrmRptLeerLectura->QuickReport1->Preview();
Query1->EnableControls();
Tcnica para hacer que la fila del DBGrid se ilumine en la medida que nos
movemos, pero con edicion y todo: (Grabarnotasgrupo en colegios)
En el datasource, evento datachange:
void __fastcall TFrmGrabarNotasGrupo::Datasource1DataChange(TObject
*Sender,
TField *Field)
{
RecNum=DSNotasTemp->DataSet->RecNo;
}
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
Si se quiere trabajar con campos time como llave, debe grabarse con
cero milisegundos para que cuando se vaya a buscar haya
coincidencia.
Recordar que es un doble y de lo contrario no coinciden lo que se
grabo con lo que se escribe en el sql. Ejemplo de signal, primero
decodificamos la hora:
HoraSignal.DecodeTime(&Hora, &Min, &Sec, &MilSec);
Y al grabarla la ponemos con cero milisegundos
FrmDMSignal->TblHistoria>FieldValues["THora"]=TDateTime(Hora,Min,Sec,0);
09/01/2015 12:53 a. m.
5 de 7
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
<<aICuenta<<ends;
}
}
Uso de los manipulators si no se usa "using namespace
catch (Exception &exception)
{
Application->ShowException(&exception);
#include<iomanip>
}
#include <sstream>
catch (MyException &e) {
Application->MessageBox(e.Mensaje(),"Error",MB_OK|MB_ICONHAND);
void __fastcall TForm1::Button1Click(TObject *Sender)
}
catch (...)
{
{
std::ostringstream os;
ShowMessage( String("An exception of type ") + __ThrowExceptionName()
char b[255];
+ "\nwas thrown by line " + AnsiString(__ThrowLineNumber())
+ "\nof file " + __ThrowFileName() );
}
os<<"1012 "<<std::setfill(' ')<<std::setw(4)<<89<<"
}
Variants:
Para convertir un variant que contenga un int a una cadena AnsiString
simplemente crear la instancia String(variante). Ej:
std"
00"<<std::ends;
ShowMessage(os.str().c_str());
ShowMessage(itoa( os.str().length(),b,10) );
}
String(DataModule1->TblKarMaest->FieldByName("IGondola")->Value);
imprime 21
Con locate:
bool LocateSuccess;
Para extraer los parametros de la lnea de comandos (SAB)
TLocateOptions SearchOptions;SearchOptions << loPartialKey; // Opcional
//LPTSTR
GetCommandLine(VOID) para hacerlo con el API
LocateSuccess = CustTable->Locate("Company", "Professional Divers,
Ltd.",
windows
SearchOptions); // campo contenido
}
// Con las variables globales del IDE (#include DOS)
/*
Para asignarle eventos a TApplication
ver en src\cbuilder\pruebas o ConsFacturacion en agua
En el constructor;
DataModule1->TblAbaBancos->BeforeDelete=TFrmBancos::NoDelete;
En el desctructor
DataModule1->TblAbaBancos->BeforeDelete=NULL;
En la implementacin del metodo a llamar, en este caso para que no borre.
void __fastcall TFrmBancos::NoDelete(TDataSet *) {
Abort();
}
*/
/*
Paso de parmetros puntero como de salida: (Se cambia la direccin del
puntero en la funcin y sale cambiada.)
Ver ejemplo punt_in_out.cpp en carpeta universidad nacional Ilustra como
a semejanza de los enteros etc. que si se desean pasar
como parmetro de salida, se debe pasar su direccin, a los punteros les
de
Para evitar warnings de que tal constructor hidden tal otro, y que de
ahi para adelante en la herencia ya no se ver el base etc.
Crear otro constructor, que en C++ se puede, y a ese aadirle el
parmetro que necesitemos, que el compilador llamar al que se
necesite segn tenga o no parmetro.
Ver src\cbuilder\repositorio\repair.cpp y h.
__fastcall TRepairDialog(TComponent* Owner);
__fastcall TRepairDialog(TComponent* Owner, String aRuta);
09/01/2015 12:53 a. m.
6 de 7
ocurre lo mismo.
bool buscar(int cod, struct biblioteca **anodo /*direccion de la
variable puntero*/) {
bool Resultado= false;
temp=lst;
while(temp->sgte!=NULL) {
if (temp->codigo==cod) {
Resultado=true;
*anodo= temp; // El contenido de Anodo es cambiado
break;
}
temp=temp->sgte;
}
// Estamos en el ultimo nodo
if(temp->codigo==cod) {
Resultado= true;
*anodo=temp;
}
return Resultado;
}
*/
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
09/01/2015 12:53 a. m.
7 de 7
http://datosoft.com/BlogCBuilder.htm#recorrerControlesForma
09/01/2015 12:53 a. m.