2026-03-20 17:16:21 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-02-24 10:16:05 -05:00
|
|
|
//| ResultsTab.mqh |
|
|
|
|
|
//| Copyright 2025, Niquel Mendoza. |
|
|
|
|
|
//| https://www.mql5.com/es/users/nique_372 |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
#property copyright "Copyright 2025, Niquel Mendoza."
|
|
|
|
|
#property link "https://www.mql5.com/es/users/nique_372"
|
2026-03-20 17:16:21 -05:00
|
|
|
#property strict
|
|
|
|
|
|
|
|
|
|
#ifndef AIDATATASKRUNER_UI_TRAINING_RESULTTAB_MQH
|
|
|
|
|
#define AIDATATASKRUNER_UI_TRAINING_RESULTTAB_MQH
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 21:40:41 -05:00
|
|
|
//| Include |
|
2026-03-20 17:16:21 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//--- Config tab (base runner)
|
|
|
|
|
#include "ConfigTab.mqh"
|
|
|
|
|
|
2026-03-20 21:40:41 -05:00
|
|
|
//+-------------------------------------------------------------------------------+
|
|
|
|
|
//| Clase intermediairoa dado que CManagerBasesSimple es generico necesitaremos |
|
|
|
|
|
//| que el padre ya le de lo que necesite el "abuelo" |
|
|
|
|
|
//+-------------------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
class CTrainingResultsAlmacenadorInt : public CGuiBaseComponent<IRunPy>
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CTrainingResultsAlmacenadorInt(void) : CGuiBaseComponent<IRunPy>("CTrainingResultsAlmacenador") {}
|
|
|
|
|
~CTrainingResultsAlmacenadorInt(void) {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 21:40:41 -05:00
|
|
|
//| Clase interfaz para alamcenjks los json |
|
2026-03-20 17:16:21 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
class CTrainingResultsAlmacenador : public CManagerBasesSimple<CJson, CTrainingResultsAlmacenadorInt>
|
|
|
|
|
{
|
2026-03-20 21:40:41 -05:00
|
|
|
protected:
|
2026-03-20 17:16:21 -05:00
|
|
|
//--- Espacio donde dibuja
|
|
|
|
|
int m_top_gap;
|
|
|
|
|
int m_left_gap;
|
|
|
|
|
int m_right_gap;
|
|
|
|
|
int m_bottom_gap;
|
|
|
|
|
|
|
|
|
|
//--- Púnteros a win y al creador de objetos
|
|
|
|
|
CWindow* m_win;
|
|
|
|
|
CWndCreate* m_creator;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
CTrainingResultsAlmacenador() {}
|
|
|
|
|
~CTrainingResultsAlmacenador() {}
|
|
|
|
|
|
|
|
|
|
//---
|
2026-03-20 21:40:41 -05:00
|
|
|
virtual bool Set(int top_gap, int left_gap, int right_gap, int bottom_gap, CWindow* win, CWndCreate* wnd_create) = 0;
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
//---
|
2026-04-11 07:16:03 -05:00
|
|
|
virtual void Show(const int row) = 0; // con eso se hara el key luego
|
2026-03-20 17:16:21 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
#define AIDATATASKRUNER_TRAINING_COL_PATH (0)
|
|
|
|
|
#define AIDATATASKRUNER_TRAINING_COL_TYPE (1)
|
|
|
|
|
#define AIDATATASKRUNER_TRAINING_COL_VIEW (2)
|
|
|
|
|
#define AIDATATASKRUNER_TRAINING_TOTALCOLS (3)
|
|
|
|
|
|
|
|
|
|
//---
|
2026-03-21 08:06:31 -05:00
|
|
|
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\settings_light.bmp"
|
2026-03-20 17:16:21 -05:00
|
|
|
string g_arr_training_tab_results_bottom[1] =
|
|
|
|
|
{
|
2026-03-21 08:06:31 -05:00
|
|
|
"Images\\EasyAndFastGUI\\Icons\\bmp16\\settings_light.bmp"
|
2026-03-20 17:16:21 -05:00
|
|
|
};
|
|
|
|
|
|
2026-03-21 08:06:31 -05:00
|
|
|
/*
|
|
|
|
|
[CTrainingTabResults]
|
|
|
|
|
m_table_res_header="Ruta|Tipo|Mirar"
|
|
|
|
|
*/
|
|
|
|
|
|
2026-03-20 17:16:21 -05:00
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
class CTrainingTabResults : public CGuiBaseComponent<IRunPy>
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
//---
|
|
|
|
|
// Visualiza y alamcana los resutlados
|
|
|
|
|
CTrainingResultsAlmacenador* m_res_almacenanor;
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
CTable m_table_res;
|
|
|
|
|
|
|
|
|
|
public:
|
2026-03-20 21:40:41 -05:00
|
|
|
CTrainingTabResults(void) : CGuiBaseComponent<IRunPy>("CTrainingTabResults"), m_res_almacenanor(NULL) {}
|
|
|
|
|
~CTrainingTabResults(void) { if(::CheckPointer(m_res_almacenanor) == POINTER_DYNAMIC) delete m_res_almacenanor; }
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
void SetExtra(CTrainingResultsAlmacenador* container) { m_res_almacenanor = container; }
|
|
|
|
|
bool Create(CWndCreate* p, CWindow& main_window, int top_gap, int left_gap, int right_gap, int bottom_gap);
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
void OnTrainingInit() override final;
|
|
|
|
|
void OnTrainingNewResult(CJson* json) override final;
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
bool OnClickButtom(const long lparam, const string& sparam);
|
2026-03-20 21:40:41 -05:00
|
|
|
// En este caso lo delegamos dado que la clase como tal no usa on lan change
|
2026-03-21 08:06:31 -05:00
|
|
|
void OnLenguajeChange() override final;
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
__forceinline uint8_t EventsFlags() const override final { return TRAINING_RUNNER_PY_FLAG_ON_TRAINIG | TRAINING_RUNNER_PY_FLAG_ON_INIT; }
|
2026-03-20 17:16:21 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
bool CTrainingTabResults::Create(CWndCreate *p, CWindow &main_window, int top_gap, int left_gap, int right_gap, int bottom_gap)
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
int x = left_gap + 10;
|
|
|
|
|
int y = top_gap + 15;
|
|
|
|
|
|
|
|
|
|
//---
|
2026-03-21 11:41:29 -05:00
|
|
|
const int initial_right = right_gap;
|
|
|
|
|
bottom_gap += 5; // Ancho en x para el textbox
|
|
|
|
|
right_gap += 185; // Mas arriba 5
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
string headers[];
|
|
|
|
|
const string header_str = m_language[GUIBASE_COMPONENT_NAME(m_table_res) + "_header"];
|
|
|
|
|
if(!StrTo::CstArray(headers, header_str, '|', true))
|
|
|
|
|
{
|
|
|
|
|
LogError(StringFormat("Fallo al hacer str to arrary str, str = %s", header_str), FUNCION_ACTUAL);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ArrayResize(headers, AIDATATASKRUNER_TRAINING_TOTALCOLS); // Trim en caso de exendete
|
|
|
|
|
|
|
|
|
|
// Aling
|
|
|
|
|
ENUM_ALIGN_MODE align[AIDATATASKRUNER_TRAINING_TOTALCOLS];
|
|
|
|
|
ArrayFill(align, 0, AIDATATASKRUNER_TRAINING_TOTALCOLS, ALIGN_LEFT);
|
|
|
|
|
|
|
|
|
|
//--- Colores
|
|
|
|
|
// Headers
|
|
|
|
|
m_table_res.HeadersColor(C'0x2A,0x4A,0x6A'); // azul oscuro
|
|
|
|
|
m_table_res.HeadersColorHover(AIDATATASKRUNER_COLOR_ACCENT); // azul accent hover
|
|
|
|
|
m_table_res.HeadersColorPressed(C'0x1E,0x38,0x52'); // más oscuro al presionar
|
|
|
|
|
m_table_res.HeadersTextColor(AIDATATASKRUNER_COLOR_TEXT_PRIMARY);
|
|
|
|
|
|
|
|
|
|
// Celdas
|
|
|
|
|
m_table_res.CellColor(AIDATATASKRUNER_COLOR_FONDO_WIN); // C'37,40,54'
|
|
|
|
|
m_table_res.CellColorHover(AIDATATASKRUNER_COLOR_EDIT_BACK); // C'0x37,0x3D,0x53' hover sutil
|
|
|
|
|
m_table_res.CElement::BackColor(AIDATATASKRUNER_COLOR_FONDO_WIN);
|
|
|
|
|
|
|
|
|
|
// Grid
|
|
|
|
|
m_table_res.GridColor(AIDATATASKRUNER_COLOR_BORDER); // C'58,63,82' sutil
|
|
|
|
|
|
|
|
|
|
// Texto celdas - vía CellInitialize usa m_label_color
|
|
|
|
|
// necesitas setearlo antes de crear:
|
|
|
|
|
m_table_res.m_label_color = AIDATATASKRUNER_COLOR_TEXT_SECONDARY;
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
CScrollH *sh = m_table_res.GetScrollHPointer();
|
|
|
|
|
|
|
|
|
|
// Fondo de la barra (el riel)
|
|
|
|
|
sh.BackColor(AIDATATASKRUNER_COLOR_FONDO_TAB); // C'26,29,39' - oscuro
|
|
|
|
|
|
|
|
|
|
// Ползunок (thumb) en 3 estados
|
|
|
|
|
sh.ThumbColor(AIDATATASKRUNER_COLOR_BORDER); // C'58,63,82' - reposo sutil
|
|
|
|
|
sh.ThumbColorHover(AIDATATASKRUNER_COLOR_BORDER_HOVER); // C'61,142,240' - hover azul
|
|
|
|
|
sh.ThumbColorPressed(AIDATATASKRUNER_COLOR_ACCENT); // C'0x69,0xA8,0xF3' - presionado
|
|
|
|
|
|
|
|
|
|
// Forzar iconos blancos
|
|
|
|
|
sh.IncFile((string)RESOURCE_SCROLL_LEFT_WHITE);
|
|
|
|
|
sh.IncFileLocked((string)RESOURCE_SCROLL_LEFT_WHITE);
|
|
|
|
|
sh.IncFilePressed((string)RESOURCE_SCROLL_LEFT_WHITE);
|
|
|
|
|
|
|
|
|
|
sh.DecFile((string)RESOURCE_SCROLL_RIGHT_WHITE);
|
|
|
|
|
sh.DecFileLocked((string)RESOURCE_SCROLL_RIGHT_WHITE);
|
|
|
|
|
sh.DecFilePressed((string)RESOURCE_SCROLL_RIGHT_WHITE);
|
|
|
|
|
|
|
|
|
|
//--- Base
|
|
|
|
|
m_table_res.CellYSize(30);
|
|
|
|
|
m_table_res.FontSize(10);
|
|
|
|
|
m_table_res.HeaderYSize(25);
|
|
|
|
|
m_table_res.IsSortMode(true);
|
|
|
|
|
m_table_res.DefaultTextAlign(ALIGN_LEFT);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
m_table_res.TableSize(AIDATATASKRUNER_TRAINING_TOTALCOLS, 1);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
m_table_res.DataType(AIDATATASKRUNER_TRAINING_COL_PATH, TYPE_STRING);
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_PATH, 0, "");
|
|
|
|
|
|
|
|
|
|
m_table_res.DataType(AIDATATASKRUNER_TRAINING_COL_TYPE, TYPE_STRING);
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_TYPE, 0, "");
|
|
|
|
|
|
|
|
|
|
m_table_res.DataType(AIDATATASKRUNER_TRAINING_COL_VIEW, TYPE_STRING);
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_VIEW, 0, "");
|
|
|
|
|
m_table_res.CellType(AIDATATASKRUNER_TRAINING_COL_VIEW, 0, CELL_BUTTON);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// m_table_res.SetImages(AIDATATASKRUNER_TASK_TABLLE_ESTADO, 0, g_taskruner_ai_dgen_main_images);
|
|
|
|
|
// m_table_res.ChangeImage(AIDATATASKRUNER_TASK_TABLLE_ESTADO, 0, 2); // gris
|
|
|
|
|
// m_table_res.DataType(AIDATATASKRUNER_TASK_TABLLE_MODIFICAR, TYPE_DATETIME);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
int arr_offset_imgeage_x[AIDATATASKRUNER_TRAINING_TOTALCOLS];
|
|
|
|
|
int arr_offset_imgeage_y[AIDATATASKRUNER_TRAINING_TOTALCOLS];
|
|
|
|
|
ArrayFill(arr_offset_imgeage_x, 0, AIDATATASKRUNER_TRAINING_TOTALCOLS, 0);
|
|
|
|
|
ArrayFill(arr_offset_imgeage_y, 0, AIDATATASKRUNER_TRAINING_TOTALCOLS, 0);
|
|
|
|
|
arr_offset_imgeage_y[AIDATATASKRUNER_TRAINING_COL_VIEW] = 5;
|
|
|
|
|
arr_offset_imgeage_x[AIDATATASKRUNER_TRAINING_COL_VIEW] = 5;
|
|
|
|
|
m_table_res.ImageXOffset(arr_offset_imgeage_x);
|
|
|
|
|
m_table_res.ImageYOffset(arr_offset_imgeage_y);
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
int text_x_offset[AIDATATASKRUNER_TRAINING_TOTALCOLS];
|
|
|
|
|
::ArrayInitialize(text_x_offset, 10);
|
|
|
|
|
m_table_res.TextXOffset(text_x_offset);
|
2026-04-11 07:16:03 -05:00
|
|
|
text_x_offset[AIDATATASKRUNER_TRAINING_COL_VIEW] += 35;
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
// Width
|
|
|
|
|
//---
|
|
|
|
|
int widths[AIDATATASKRUNER_TRAINING_TOTALCOLS];
|
|
|
|
|
|
2026-03-21 11:41:29 -05:00
|
|
|
//---
|
|
|
|
|
int x_size_table = main_window.XSize() - right_gap - left_gap;
|
|
|
|
|
|
2026-03-20 17:16:21 -05:00
|
|
|
//--- Hagamos un resize debdio a que los nombres de los params y modelos aveces son GRADENS
|
2026-03-21 11:41:29 -05:00
|
|
|
widths[AIDATATASKRUNER_TRAINING_COL_PATH] = (x_size_table - 150);
|
2026-03-20 17:16:21 -05:00
|
|
|
widths[AIDATATASKRUNER_TRAINING_COL_TYPE] = 80;
|
2026-03-26 12:50:40 -05:00
|
|
|
widths[AIDATATASKRUNER_TRAINING_COL_VIEW] = 100;
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
m_table_res.ColumnsWidth(widths);
|
|
|
|
|
|
2026-03-21 11:41:29 -05:00
|
|
|
|
2026-03-20 17:16:21 -05:00
|
|
|
//---
|
|
|
|
|
if(!p.CreateTable(
|
|
|
|
|
m_table_res,
|
|
|
|
|
main_window,
|
|
|
|
|
0,
|
|
|
|
|
m_base_tab,
|
|
|
|
|
m_base_tab_idx,
|
|
|
|
|
AIDATATASKRUNER_TRAINING_TOTALCOLS,
|
|
|
|
|
1,
|
|
|
|
|
headers,
|
|
|
|
|
x,
|
|
|
|
|
y,
|
|
|
|
|
0,
|
|
|
|
|
0,
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
right_gap,
|
|
|
|
|
bottom_gap
|
|
|
|
|
))
|
|
|
|
|
{
|
|
|
|
|
AIDATATASKRUNER_ERROR_CREATION(m_table_res);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
x += m_table_res.XSize() + 5; // Avanza (+ gap de 5)
|
|
|
|
|
|
|
|
|
|
//---
|
2026-03-21 11:41:29 -05:00
|
|
|
if(!m_res_almacenanor.Set(y, x, initial_right, bottom_gap, &main_window, p))
|
2026-03-20 21:40:41 -05:00
|
|
|
{
|
|
|
|
|
AIDATATASKRUNER_ERROR_CREATION(m_res_almacenanor);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2026-03-20 17:16:21 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
//| |
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-21 08:06:31 -05:00
|
|
|
void CTrainingTabResults::OnLenguajeChange(void)
|
|
|
|
|
{
|
|
|
|
|
m_res_almacenanor.OnLenguajeChange();
|
|
|
|
|
|
|
|
|
|
// Headers de la tabla
|
|
|
|
|
const string header_str = m_language[AIDATATASKRUNNERL_COMPONENT_NAME(m_table_res) + "_header"];
|
|
|
|
|
string headers[];
|
|
|
|
|
if(StrTo::CstArray(headers, header_str, '|', true))
|
|
|
|
|
{
|
|
|
|
|
const int cols = (int)m_table_res.ColumnsTotal();
|
|
|
|
|
for(int i = 0; i < cols; i++)
|
|
|
|
|
{
|
|
|
|
|
m_table_res.SetHeaderText(i, headers[i]);
|
|
|
|
|
}
|
|
|
|
|
m_table_res.Update(true);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
LogError("Fallo al hacer split str array en table res", FUNCION_ACTUAL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| |
|
|
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
void CTrainingTabResults::OnTrainingInit(void)
|
|
|
|
|
{
|
|
|
|
|
//--- Limpiamos la tabla de resultados
|
2026-04-11 07:16:03 -05:00
|
|
|
m_table_res.ResizeRows(0);
|
2026-03-20 17:16:21 -05:00
|
|
|
}
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
//| |
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
void CTrainingTabResults::OnTrainingNewResult(CJson *json)
|
|
|
|
|
{
|
|
|
|
|
//---
|
|
|
|
|
int idx;
|
|
|
|
|
if(m_table_res.RowsTotal() == 1 && m_table_res.GetValue(0, 0) == "")
|
|
|
|
|
{
|
|
|
|
|
idx = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
idx = (int)m_table_res.RowsTotal();
|
|
|
|
|
m_table_res.AddRow(idx);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//--- Path
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_PATH, idx, json["path"].ToString("?"));
|
|
|
|
|
|
|
|
|
|
//--- Tipo
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_TYPE, idx, json["type"].ToString("?"));
|
|
|
|
|
|
|
|
|
|
//--- Bottom
|
|
|
|
|
m_table_res.SetImages(AIDATATASKRUNER_TRAINING_COL_VIEW, idx, g_arr_training_tab_results_bottom);
|
|
|
|
|
m_table_res.SetValue(AIDATATASKRUNER_TRAINING_COL_VIEW, idx, "View");
|
|
|
|
|
m_table_res.CellType(AIDATATASKRUNER_TRAINING_COL_VIEW, idx, CELL_BUTTON);
|
|
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
m_table_res.Update(true);
|
2026-04-11 07:16:03 -05:00
|
|
|
|
|
|
|
|
//---
|
|
|
|
|
m_res_almacenanor.AddItemFast(json);
|
2026-03-20 17:16:21 -05:00
|
|
|
}
|
2026-03-20 21:40:41 -05:00
|
|
|
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
//| |
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
bool CTrainingTabResults::OnClickButtom(const long lparam, const string &sparam)
|
|
|
|
|
{
|
|
|
|
|
if(lparam == m_table_res.Id() && sparam.Length() > 3 && sparam[0] == 'c' && sparam[1] == 'e' && sparam[2] == 'l' && sparam[3] == 'l') // Click en cell
|
|
|
|
|
{
|
|
|
|
|
const int row = int(StringSubstr(sparam, 6)); // Desde la posicion 2 hasta todo (inlcuen [c][e][l][l][N][_][A])
|
2026-04-11 07:16:03 -05:00
|
|
|
m_res_almacenanor.Show(row);
|
2026-03-20 17:16:21 -05:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2026-02-24 10:16:05 -05:00
|
|
|
//+------------------------------------------------------------------+
|
2026-03-20 17:16:21 -05:00
|
|
|
#endif // AIDATATASKRUNER_UI_TRAINING_RESULTTAB_MQH
|