{"id":512,"date":"2022-01-09T20:37:18","date_gmt":"2022-01-09T23:37:18","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=512"},"modified":"2022-07-13T16:05:35","modified_gmt":"2022-07-13T19:05:35","slug":"usando-o-combobox-com-valores-explicitos-e-implicitos","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/programacao\/lazarus-ide\/usando-o-combobox-com-valores-explicitos-e-implicitos\/","title":{"rendered":"Using ComboBox to select normal and complex values"},"content":{"rendered":"\n<p>O combobox (TComboBox) \u00e9 um componente que apresenta uma lista de v\u00e1rios valores onde tipicamente escolhemos um. Imagine uma lista de frutas:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Maracuj\u00e1<\/li><li>A\u00e7a\u00ed<\/li><li>Avel\u00e3<\/li><li>Mel\u00e3o<\/li><li>Ma\u00e7\u00e3<\/li><li>Mam\u00e3o<\/li><\/ul>\n\n\n\n<p>E voc\u00ea precisa apresentar uma forma de escolha ao usu\u00e1rio que seja econ\u00f4mica num formul\u00e1rio, isto \u00e9, que n\u00e3o ocupe muito espa\u00e7o, ent\u00e3o usamos isso:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video controls src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/UsandoCombobox1.webm\"><\/video><figcaption>Selecionando um elemento dum ComboBox<\/figcaption><\/figure>\n\n\n\n<p>Um ComboBox pode ser alimentado com valores literais, isto \u00e9,  o que os olhos v\u00eaem ser\u00e1 exatamente o que ser\u00e1 manipulado depois. Mas tamb\u00e9m h\u00e1 a op\u00e7\u00e3o de escolher com os olhos um valor, mas ter outros atributos a serem usados. Parece estranho, mas fica mais f\u00e1cil entender na pr\u00e1tica.<\/p>\n\n\n\n<p>Valores literais numa ComboBox pode ser alimentada assim:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cbLista.Clear;\n<strong>cbLista.Items.Add('Maracuj\u00e1');\ncbLista.Items.Add('Aca\u00ed');\ncbLista.Items.Add('Avel\u00e3');\ncbLista.Items.Add('Mel\u00e3o');\ncbLista.Items.Add('Ma\u00e7\u00e3');\ncbLista.Items.Add('Mam\u00e3o'); <\/strong><\/code><\/pre>\n\n\n\n<p>No entanto, o exemplo acima n\u00e3o \u00e9 uma boa pr\u00e1tica de programa\u00e7\u00e3o em quase nenhuma linguagem. Se voc\u00ea trabalha em equipe, nunca deixariam voc\u00ea implementar o c\u00f3digo acima, pois ao mudar um valor de um dos elementos da lista teria de alterar todas as ocorr\u00eancias desse mesmo valor dentro do programa tamb\u00e9m, e se esquecesse de alterar um deles  poderia criar s\u00e9rios problemas, portanto, sempre que alimentar um ComboBox com valores literais, fa\u00e7a uso de constantes. <\/p>\n\n\n\n<p>Geralmente as constantes dever\u00e3o estar na se\u00e7\u00e3o <strong>implementation<\/strong>, pois isso garantiria que as constantes estariam vis\u00edveis apenas a unidade do projeto, declarar constantes <strong>fora da se\u00e7\u00e3o implementation <\/strong>significaria que pretende usar estas mesmas constantes em outras unidades &#8211; algo bem raro que se usado erroneamente confunde a IDE e pode causar erros de l\u00f3gica dif\u00edceis de encontrar. Ent\u00e3o ficaria assim nosso ajuste:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  Form1: TForm1;\n\n<strong>implementation<\/strong>\n\n{$R *.lfm}\n\n{ TForm1 }\n\n<strong>const\n  Maracuja='Maracuj\u00e1';\n  Acai='A\u00e7a\u00ed';\n  Avela='Avel\u00e3';\n  Melao='Mel\u00e3o';\n  Maca='Ma\u00e7\u00e3';\n  Mamao='Mam\u00e3o';<\/strong>\n\nprocedure TForm1.FormCreate(Sender: TObject);\nbegin\n  cbLista.Clear;\n<strong>  cbLista.Items.Add(Maracuja);\n  cbLista.Items.Add(Acai);\n  cbLista.Items.Add(Avela);\n  cbLista.Items.Add(Melao);\n  cbLista.Items.Add(Maca);\n  cbLista.Items.Add(Mamao);\n<\/strong>  cbLista.ItemIndex:=-1; <strong> <\/strong> <\/code><\/pre>\n\n\n\n<p>E para recuperar o valor escolhido simplesmente fazemos isso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  FrutaCodigoEscolhida:String;\nbegin\n  if cbLista.ItemIndex&gt;=0 then\n  begin\n    FrutaCodigoEscolhida:=cbLista.Items.Objects&#91;cbLista.ItemIndex];\n    Memo1.Lines.Add('fruta escolhida: '+IntToStr(FrutaCodigoEscolhida));\n  end;  <\/code><\/pre>\n\n\n\n<p>N\u00e3o tem nada mais simples do que o c\u00f3digo acima e \u00e9 o m\u00e9todo mais usado, mas e se fosse algo mais sofisticado? Imagine que ao selecionar <strong>Maracuj\u00e1<\/strong> voc\u00ea queira que o sistema prossiga dizendo que  foi selecionado o c\u00f3digo <strong>5,<\/strong> isso mesmo, um numero ao inv\u00e9s do texto que foi exibido e selecionado. Neste caso voc\u00ea usaria um m\u00e9todo chamado <strong>AddObject<\/strong> que serve para atrelar um item da lista a um objeto qualquer previamente criado, mas criar um objeto implica em criarmos construtores, destrutores e propriedades e \u00e9 muita areia para o nosso caminh\u00e3ozinho ent\u00e3o vamos usar uma forma simplificada de objeto que usar\u00e1 um numero inteiro como objeto(esquisito isso n\u00e9, explico mais adiante), ficaria assim para popularmos nosso ComboBox:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>procedure TForm1.FormCreate(Sender: TObject);\nbegin\n  cbLista.Clear;\n<strong>  cbLista.Items.AddObject(Maracuja, TObject(5));\n  cbLista.Items.AddObject(Acai, TObject(10));\n  cbLista.Items.AddObject(Avela, TObject(15));\n  cbLista.Items.AddObject(Melao, TObject(20));\n  cbLista.Items.AddObject(Maca, TObject(25));\n  cbLista.Items.AddObject(Mamao, TObject(30));<\/strong>\n  cbLista.ItemIndex:=-1;<\/code><\/pre>\n\n\n\n<p>No exemplo acima conseguimos fazer um numero se passar como um objeto &#8211; chamamos isso de casting &#8211; fazer casting de n\u00fameros para objetos \u00e9 algo bem criativo e n\u00e3o daria certo dessa maneira simplificada com outros tipos primitivos, mas funciona com n\u00fameros porque o resultado \u00e9 ponteiro de mem\u00f3ria. Para recuperar o valor selecionado bastaria ent\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  FrutaCodigoEscolhida:Integer;\nbegin\n  if cbLista.ItemIndex&gt;=0 then\n  begin\n    FrutaCodigoEscolhida:=PtrUInt(cbLista.Items.Objects&#91;cbLista.ItemIndex]);\n    Memo1.Lines.Add('codigo escolhido: '+IntToStr(FrutaCodigoEscolhida));\n  end; <\/code><\/pre>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"418\" style=\"aspect-ratio: 587 \/ 418;\" width=\"587\" controls src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/demo_combobox_enum1.webm\"><\/video><figcaption>Combobox &#8211; selecionando um elemento e retornando um c\u00f3digo<\/figcaption><\/figure>\n\n\n\n<p>Mas e se n\u00e3o fosse para retornar um n\u00famero e sim uma outra String, digamos que ao selecionar <strong>Maracuj\u00e1 <\/strong>eu gostaria de retornar um c\u00f3digo alfanum\u00e9rico como &#8216;<strong>cod_maracuja<\/strong>&#8216;? Um exemplo pr\u00e1tico seria selecionar pela descri\u00e7\u00e3o, por\u00e9m retornar um c\u00f3digo de barras, mas para ser did\u00e1tico vou resumir numa palavra. Isso pode ser feito de duas formas, usando par de chave e valor ou por meio de objetos. Vou mostrar o m\u00e9todo que \u00e9 mais simples o par chave e valor, voc\u00ea j\u00e1 deve ter observado que propriedades como TItems e TStrings pode ser usado com \u00edndices(ItemIndex:=x) e tamb\u00e9m par\/valor, este ultimo geralmente usado em algo como MinhaStringList.Values[&#8216;var&#8217;] para retornar o valor atrelado a &#8216;var&#8217;, pois bem, vamos dar o nome de <strong>AddPair<\/strong> porque a t\u00e1tica \u00e9 atribuir um valor a uma vari\u00e1vel da lista por isso o nome: <strong>AddPair<\/strong> do ingl\u00eas &#8216;adicionar par&#8217;. Ainda usaremos a mesma lista de nosso exemplo, vamos popular nossa base da seguinte forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>procedure TForm1.FormCreate(Sender: TObject);\nbegin\n  cbLista.Clear;\n<strong>  cbLista.Items.AddPair(Maracuja, 'cod_maracuja');\n  cbLista.Items.AddPair(Acai, 'cod_acai');\n  cbLista.Items.AddPair(Avela, 'cod_avela');\n  cbLista.Items.AddPair(Melao, 'cod_melao');\n  cbLista.Items.AddPair(Maca, 'cod_maca');\n  cbLista.Items.AddPair(Mamao, 'cod_mamao');<\/strong>\n  cbLista.ItemIndex:=-1;<\/code><\/pre>\n\n\n\n<p>Mas isso  n\u00e3o resolveria o problema ainda, por que n\u00e3o? Porque nosso ComboBox seria visto assim:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"541\" height=\"307\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor1.png\" alt=\"\" class=\"wp-image-627\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor1.png 541w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor1-300x170.png 300w\" sizes=\"auto, (max-width: 541px) 100vw, 541px\" \/><figcaption>Sem o csOwnerDraw, nosso usu\u00e1rio veria o par dos elementos<\/figcaption><\/figure>\n\n\n\n<p>Ent\u00e3o precisamos mudar a forma como nosso  ComboBox  ser\u00e1 exibido, tecnicamente ele ainda \u00e9 do jeito acima internamente, mas externamente, isto \u00e9, a forma como ser\u00e1 apresentado deve ser modificado. J\u00e1 que iremos desenhar nosso  pr\u00f3prio ComboBox  vamos precisar modificar a propriedade <strong>cbLista.Style <\/strong> para <strong>csOwnerDrawFixed<\/strong> ou <strong>csOwnerDrawVariable<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"987\" height=\"631\" src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor2-1.png\" alt=\"\" class=\"wp-image-630\" srcset=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor2-1.png 987w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor2-1-300x192.png 300w, https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/combobox_parvalor2-1-768x491.png 768w\" sizes=\"auto, (max-width: 987px) 100vw, 987px\" \/><figcaption>\u00c9 preciso modificar a propriedade <strong>cbLista.Style <\/strong> para <strong>csOwnerDrawFixed<\/strong> ou <strong>csOwnerDrawVariable<\/strong><\/figcaption><\/figure>\n\n\n\n<p>E ent\u00e3o incluir um c\u00f3digo de programa\u00e7\u00e3o ao evento <strong>OnDrawItem<\/strong> respons\u00e1vel por desenhar a apar\u00eancia do ComboBox, vou deix\u00e1-lo da maneira mais simples poss\u00edvel, mais tarde poder\u00e1 complementar criando cores alternadas se achar necess\u00e1rio:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>procedure TForm1.cbListaDrawItem(Control: TWinControl; Index: Integer;\n  ARect: TRect; State: TOwnerDrawState);\nbegin\n  with (Control as TComboBox) do\n  begin\n    if odSelected in State then       \/\/ requer unit LCLType\n    begin\n      Brush.Color := clWhite;\n      Font.Color := clBlack;\n    end;\n    Canvas.FillRect(ARect);\n    Canvas.TextOut(ARect.Left, ARect.Top, Items.Names&#91;Index]);\n  end;\nend;  <\/code><\/pre>\n\n\n\n<p>Agora nossos elementos ser\u00e3o vistos assim:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"428\" style=\"aspect-ratio: 570 \/ 428;\" width=\"570\" controls src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/demo_combobox_parvalor1.webm\"><\/video><figcaption>Agora vemos apenas o primeiro par, sem ver o valor dele<\/figcaption><\/figure>\n\n\n\n<p>E para resgatar o valor selecionado faremos assim:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  Fruta_Escolhida_Par_Nome:String;\n  Fruta_Escolhida_Par_Valor:String;\nbegin\n  if cbLista.ItemIndex&gt;=0 then\n  begin\n    Fruta_Escolhida_Par_Nome := cbLista.Items.Names&#91;cbLista.ItemIndex];\n    Fruta_Escolhida_Par_Valor:= cbLista.items.Values&#91;Fruta_Escolhida_Par_Nome];\n    Memo1.Lines.Add('Fruta escolhida: ');\n    Memo1.Lines.Add('  Nome: '+Fruta_Escolhida_Par_Nome);\n    Memo1.Lines.Add('  Valor: '+Fruta_Escolhida_Par_Valor);\n  end; <\/code><\/pre>\n\n\n\n<p>E valores ainda mais complexos? Imagine que ao selecionar <strong>Maracuj\u00e1 <\/strong>voc\u00ea queira que o sistema retorne uma s\u00e9rie de propriedades como nome,  c\u00f3digo e o peso da fruta (nosso exemplo) ent\u00e3o neste caso n\u00e3o podemos usar um casting ou o m\u00e9todo par\/valor como nos exemplos anteriores, temos de criar um objeto completo para armazenar essas informa\u00e7\u00f5es. Vamos declarar nosso objeto com tudo que um objeto precisa: construtor, destrutor e as propriedades:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  { TFruta }\n  type TFruta=class(TObject)\n  private\n    FNome: string;\n    FPesoGrama: Integer;\n    FCodigo: Integer;\n  public\n    constructor Create(ANome:String; APesoGrama:Integer; ACodigo:Integer);\n    destructor Destroy; override;\n  published\n    property Nome: string read FNome write FNome;\n    property PesoGrama: Integer read FPesoGrama write FPesoGrama;\n    property Codigo:Integer read FCodigo write FCodigo;\n  end;  <\/code><\/pre>\n\n\n\n<p>O m\u00e9todo create com par\u00e2metros \u00e9 apenas para nos poupar na hora de cria\u00e7\u00e3o, ent\u00e3o vamos ao c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>constructor TFruta.Create(ANome: String; APesoGrama: Integer; ACodigo: Integer);\nbegin\n  Nome := ANome;\n  PesoGrama:=APesoGrama;\n  Codigo:=ACodigo;\nend;\n\ndestructor TFruta.Destroy;\nbegin\n  inherited Destroy;\nend;\n       <\/code><\/pre>\n\n\n\n<p>Tendo criado o nosso objeto ent\u00e3o agora vamos popular o ComboBox da seguinte forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>procedure TForm1.FormCreate(Sender: TObject);\nbegin\n  cbLista.Clear;\n <strong> cbLista.Items.AddObject(Maracuja, TFruta.Create(Maracuja,550,5));\n  cbLista.Items.AddObject(Acai, TFruta.Create(Acai,300,10));\n  cbLista.Items.AddObject(Avela, TFruta.Create(Avela,15,15));\n  cbLista.Items.AddObject(Melao, TFruta.Create(Melao,500,20));\n  cbLista.Items.AddObject(Maca, TFruta.Create(Maca,55,25));\n  cbLista.Items.AddObject(Mamao, TFruta.Create(Mamao,700,30));<\/strong>\n  cbLista.ItemIndex:=-1;      <\/code><\/pre>\n\n\n\n<p>E para exibir o valor que foi escolhido ent\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>var\n  Fruta_Escolhida:TFruta;\nbegin\n  if cbLista.ItemIndex&gt;=0 then\n  begin\n    Fruta_Escolhida := TFruta(cbLista.Items.Objects&#91;cbLista.ItemIndex]);\n    Memo1.Lines.Add('Fruta escolhida: '+Fruta_Escolhida.Nome);\n    Memo1.Lines.Add('  Codigo: '+IntToStr(Fruta_Escolhida.Codigo));\n    Memo1.Lines.Add('  Peso aproximado gramas: '+IntToStr(Fruta_Escolhida.PesoGrama));\n  end;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"428\" style=\"aspect-ratio: 570 \/ 428;\" width=\"570\" controls src=\"https:\/\/gladiston.net.br\/wp-content\/uploads\/2022\/01\/demo_combobox_objetos1.webm\"><\/video><figcaption>Combobox &#8211; selecionando um elemento e retornando um objeto<\/figcaption><\/figure>\n\n\n\n<p>Usar um objeto ao inv\u00e9s de um texto \u00e9 mais comum do que voc\u00ea imagina, especialmente com banco de dados, onde com m\u00e9todos como getters e setters (property &#8230; get &#8230; set &#8230;.) voc\u00ea pode pegar os resultados desejados diretamente do banco de dados ao inv\u00e9s de popular a lista previamente como n\u00f3s fizemos. Nosso exemplo era para ser did\u00e1tico.<\/p>\n\n\n\n<p>Espero ter esclarecido as formas mais comuns &#8211; talvez as \u00fanicas &#8211; de utilizar um ComboBox e retornar dados de formas diferentes. Se precisarem do c\u00f3digo fonte dos exemplos usados poder\u00e3o baix\u00e1-los no link a seguir:<\/p>\n\n\n\n<p>1. <a href=\"https:\/\/github.com\/gladiston\/demo_combobox_explicito\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/github.com\/gladiston\/demo_combobox_explicito\">Demonstra\u00e7\u00e3o do uso do componente TCombobox no Delphi e FreePascal &#8211; uso comum<\/a><\/p>\n\n\n\n<p>2. <a href=\"https:\/\/github.com\/gladiston\/demo_combobox_casting\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/github.com\/gladiston\/demo_combobox_casting\">Demonstra\u00e7\u00e3o de uso do combobox &#8211; retornando c\u00f3digo do elemento selecionado<\/a><\/p>\n\n\n\n<p>3. <a href=\"https:\/\/github.com\/gladiston\/demo_combobox_parvalor\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/github.com\/gladiston\/demo_combobox_parvalor\">Demonstra\u00e7\u00e3o de uso do combobox &#8211; retornando uma string diferente do elemento selecionado<\/a><\/p>\n\n\n\n<p>4.  <a href=\"https:\/\/github.com\/gladiston\/demo_combobox_objetos\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/github.com\/gladiston\/demo_combobox_objetos\">Demonstra\u00e7\u00e3o de uso do combobox &#8211; retornando o objeto do elemento selecionado<\/a><\/p>\n\n\n\n<p>No v\u00eddeo a seguir, demonstro como usar essas quatro formas diferentes e uma outra adicional que \u00e9 uma derivativa de objeto, por\u00e9m retornando informa\u00e7\u00f5es de uma base de dados:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Usando o ComboBox para selecionar valores normais e complexos - Lazarus\" width=\"580\" height=\"326\" src=\"https:\/\/www.youtube.com\/embed\/JUj1Z1HUQ-M?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption>Video demonstrativo de como aplicar as t\u00e9cnicas mencionadas neste artigo<\/figcaption><\/figure>\n\n\n\n<p>Caso queira estudar os exemplos, os mesmos podem ser obtidos aqui:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/gladiston\/lazdemos_gsl\">https:\/\/github.com\/gladiston\/lazdemos_gsl<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O combobox (TComboBox) \u00e9 um componente que apresenta uma lista de v\u00e1rios valores onde tipicamente escolhemos um. Imagine uma lista de frutas: Maracuj\u00e1 A\u00e7a\u00ed Avel\u00e3 Mel\u00e3o Ma\u00e7\u00e3 Mam\u00e3o E voc\u00ea precisa apresentar uma forma de escolha ao usu\u00e1rio que seja econ\u00f4mica num formul\u00e1rio, isto \u00e9, que n\u00e3o ocupe muito espa\u00e7o, ent\u00e3o usamos isso: Um ComboBox [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":159,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-512","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=512"}],"version-history":[{"count":31,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/512\/revisions"}],"predecessor-version":[{"id":929,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/512\/revisions\/929"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/159"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}